【Android】ネットワーク状態を監視する

監視

ネットワークが無いときから復帰した時の状態取得して、処理したいですよね。
例えば、ネットワーク無いからローカルキャッシュ使って画面表示してるけど、ネットワークが復帰したら最新の情報を取得して、画面を最新の状態にしたいってことよく有りますよね。

BroadCastReceiver使うと出来るみたいです。個人で使うようにリスナー作ってみました。__Log, Utilsは自作クラスです。

ネットワークの状態はConnectivityManagerのEXTRA_〜で取得できます。

NetworkStateReceiver

public class NetworkStateReceiver extends BroadcastReceiver {


    public static final IntentFilter NETWORK_INTENT_FILTER = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

    private static final String TAG = NetworkStateReceiver.class.getSimpleName();

    private static boolean sBeforeNetworkContext = false; // 前回のネットワーク状態を保持

    private NetworkStateListener mNetworkStateListener;

    public NetworkStateReceiver() {
    }

    public NetworkStateReceiver(NetworkStateListener listener) {
        this.mNetworkStateListener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle extra = intent.getExtras();
        if (extra == null) {
            return;
        }

        __Log.d(TAG, "=====================================");
        __Log.d(TAG, "EXTRA_EXTRA_INFO: " + extra.getString(ConnectivityManager.EXTRA_EXTRA_INFO));
        __Log.d(TAG, "EXTRA_IS_FAILOVER: " + extra.getString(ConnectivityManager.EXTRA_IS_FAILOVER));
        __Log.d(TAG, "EXTRA_NETWORK_INFO: " + extra.getString(ConnectivityManager.EXTRA_NETWORK_INFO));
        __Log.d(TAG, "EXTRA_NETWORK_TYPE: " + extra.getString(ConnectivityManager.EXTRA_NETWORK_TYPE));
        __Log.d(TAG, "EXTRA_NO_CONNECTIVITY: " + extra.getString(ConnectivityManager.EXTRA_NO_CONNECTIVITY));
        __Log.d(TAG, "EXTRA_REASON: " + extra.getString(ConnectivityManager.EXTRA_REASON));
        __Log.d(TAG, "ConnectionArrive? : " + Utils.arriveConnection(context));
        __Log.d(TAG, "=====================================\n");

        if(mNetworkStateListener == null) {
            return;
        }

        final boolean nowNetworkContext = Utils.arriveConnection(context);
        if (sBeforeNetworkContext == nowNetworkContext) {
            return;
        }

        sBeforeNetworkContext = nowNetworkContext;

        if(Utils.arriveConnection(context)){
            mNetworkStateListener.onConnect();
        } else  {
            mNetworkStateListener.onDisConnect();
        }
    }

    public interface NetworkStateListener {
        public void onConnect();

        public void onDisConnect();
    }
}

※2014/02/14 ネットワーク状態がtrue→trueになった場合でもonConnect()の処理が走っていたので更新。

Log

Extraで何か取れるかなぁと思ったらSimとかSSIDの情報しか入ってなかったので、ContextからConnectivityManagerのインスタンスを取得して通信があるかどうか判断してます。

ネットワークが切れた場合

02-13 21:55:20.522  26224-26224/? D/NetworkStateReceiver﹕ == =====================================
02-13 21:55:20.522  26224-26224/? D/NetworkStateReceiver﹕ == EXTRA_EXTRA_INFO: [SIM情報]
02-13 21:55:20.522  26224-26224/? D/NetworkStateReceiver﹕ == EXTRA_IS_FAILOVER: null
02-13 21:55:20.532  26224-26224/? D/NetworkStateReceiver﹕ == EXTRA_NETWORK_INFO: null
02-13 21:55:20.532  26224-26224/? D/NetworkStateReceiver﹕ == EXTRA_NETWORK_TYPE: null
02-13 21:55:20.532  26224-26224/? D/NetworkStateReceiver﹕ == EXTRA_NO_CONNECTIVITY: null
02-13 21:55:20.532  26224-26224/? D/NetworkStateReceiver﹕ == EXTRA_REASON: null
02-13 21:55:20.532  26224-26224/? D/NetworkStateReceiver﹕ == ConnectionArrive? : false
02-13 21:55:20.532  26224-26224/? D/NetworkStateReceiver﹕ == =====================================

ネットワーク復帰した場合

02-13 21:55:42.282  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == =====================================
02-13 21:55:42.282  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == EXTRA_EXTRA_INFO: [SSID情報]
02-13 21:55:42.282  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == EXTRA_IS_FAILOVER: null
02-13 21:55:42.282  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == EXTRA_NETWORK_INFO: null
02-13 21:55:42.292  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == EXTRA_NETWORK_TYPE: null
02-13 21:55:42.292  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == EXTRA_NO_CONNECTIVITY: null
02-13 21:55:42.292  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == EXTRA_REASON: null
02-13 21:55:42.292  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == ConnectionArrive? : true
02-13 21:55:42.292  26224-26224/jp.co.excite.news.debug D/NetworkStateReceiver﹕ == =====================================

使い方

どこでもいいので、インスタンス化してActivity#registerReceiver()します。

不要になったらActivity#unregisterReceiver()しましょう。

public class SampleActionBarActivity extends ActionBarActivity {

    private BroadcastReceiver mNetworkReveiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mNetworkReveiver = new NetworkStateReceiver(new NetworkStateReceiver.NetworkStateListener() {
            @Override
            public void onConnect() {
                // connect
            }

            @Override
            public void onDisConnect() {
                // disconnect
            }
        });
        registerReceiver(mNetworkReveiver,NetworkStateReceiver.NETWORK_INTENT_FILTER);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mNetworkReveiver);
    }
}

とりあえず、Gistに置いておきます。

※アイキャッチ画像にはフリーフォントのようじょふぉんとを使わせて頂いております。