ネットワークの接続状態を監視するには、少し前まではBroadcastReceiverを使用しましたが、Android 7(APIレベル24)から非推奨、Android 9(APIレベル28)から廃止になりました。
現在ではNetworkRequestを使用することが推奨されています。
ConnectivityManager | Android Developers
まず、ネットワークの接続状態を確認するためには、AndroidManifestにパーミッションのリクエストを追加する必要があります。
1 |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> |
パーミッションのリクエストを追加したら次は必要なプログラムを追加していきます。
目次
- 1 ①ネットワークの接続状態を入れるLiveDataクラス作成
- 2 ②ネットワーク情報を取得するために、ネットワーク情報を管理しているクラスConnectivityManagerを追加
- 3 ③onActive()メソッドとonInactive()メソッドをオーバーライド
- 4 ④ネットワークの接続状態の変化を受け取るコールバックを追加
- 5 ⑤NetworkCallbackクラスのonAvailable()メソッドをオーバーライドしてLiveDataにtrueを渡す
- 6 ⑥NetworkCallbackクラスのonLost()メソッドをオーバーライドしてLiveDataにfalseを渡す
- 7 ⑦NetworkRequestに調べたいネットワークの種類をセット
- 8 ⑧ネットワークの接続状態の変化を受け取るコールバックの登録と解除を追加
- 9 ⑨作成したLiveDataクラスをsubscribe
①ネットワークの接続状態を入れるLiveDataクラス作成
1 2 |
class NetworkStateLiveData(context: Context): LiveData<Boolean>() { } |
②ネットワーク情報を取得するために、ネットワーク情報を管理しているクラスConnectivityManagerを追加
1 |
private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager |
③onActive()メソッドとonInactive()メソッドをオーバーライド
1 2 3 4 5 6 7 |
override fun onActive() { super.onActive() } override fun onInactive() { super.onInactive() } |
④ネットワークの接続状態の変化を受け取るコールバックを追加
1 2 |
private val networkCallback = object : ConnectivityManager.NetworkCallback() { } |
⑤NetworkCallbackクラスのonAvailable()メソッドをオーバーライドしてLiveDataにtrueを渡す
1 2 3 4 5 6 7 |
// ネットワークが使用可能になったときに呼ばれる override fun onAvailable(network: Network) { super.onAvailable(network) // LiveDataにtrueを渡す postValue(true) } |
⑥NetworkCallbackクラスのonLost()メソッドをオーバーライドしてLiveDataにfalseを渡す
1 2 3 4 5 6 7 |
// ネットワークの接続が切れたときに呼ばれる override fun onLost(network: Network) { super.onLost(network) // LiveDataにfalseを渡す postValue(false) } |
⑦NetworkRequestに調べたいネットワークの種類をセット
◎ネットワークの種類は以下の7つ
TRANSPORT_CELLULAR
TRANSPORT_WIFI
TRANSPORT_BLUETOOTH
TRANSPORT_ETHERNET
TRANSPORT_VPN
TRANSPORT_WIFI_AWARE
TRANSPORT_LOWPAN
1 2 3 |
// NetworkRequestに調べたいネットワークの種類をaddTransportType()メソッドでセット // 今回はWifiを指定 val request = NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() |
⑧ネットワークの接続状態の変化を受け取るコールバックの登録と解除を追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// LiveDataが1つでもObserveされている場合に呼ばれる override fun onActive() { super.onActive() // NetworkRequestに調べたいネットワークの種類をaddTransportType()メソッドでセット // 今回はWifiを指定 val request = NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() // ⑧ // ネットワークの接続状態の変化を受け取るコールバックを登録 // 第1引数:NetworkRequest、第2引数:NetworkCallback connectivityManager.registerNetworkCallback(request, networkCallback) } // LiveDataが1つもObserveされていない場合に呼ばれる override fun onInactive() { super.onInactive() // ⑧ // コールバック解除 connectivityManager.unregisterNetworkCallback(networkCallback) } |
①〜⑧を行ったLiveDataクラスの全体的な形は以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// ① // ネットワークの接続状態を入れるLiveData class NetworkStateLiveData(context: Context): LiveData<Boolean>() { // ② // ネットワーク情報を取得するために、ネットワーク情報を管理しているクラスConnectivityManagerを使用 private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager // ③ // LiveDataが1つでもObserveされている場合に呼ばれる override fun onActive() { super.onActive() // ⑦ // NetworkRequestに調べたいネットワークの種類をaddTransportType()メソッドでセット // 今回はWifiを指定 val request = NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() // ⑧ // ネットワークの接続状態の変化を受け取るコールバックを登録 // 第1引数:NetworkRequest、第2引数:NetworkCallback connectivityManager.registerNetworkCallback(request, networkCallback) } // ③ // LiveDataが1つもObserveされていない場合に呼ばれる override fun onInactive() { super.onInactive() // ⑧ // コールバック解除 connectivityManager.unregisterNetworkCallback(networkCallback) } // ④ // ネットワークの接続状態の変化を受け取るコールバック private val networkCallback = object : ConnectivityManager.NetworkCallback() { // ⑤ // ネットワークが使用可能になったときに呼ばれる override fun onAvailable(network: Network) { super.onAvailable(network) // LiveDataにtrueを渡す postValue(true) } // ⑥ // ネットワークの接続が切れたときに呼ばれる override fun onLost(network: Network) { super.onLost(network) // LiveDataにfalseを渡す postValue(false) } } } |
あとはこのLiveDataをActivity等で使うようにします。
⑨作成したLiveDataクラスをsubscribe
1 2 3 4 5 6 7 8 9 10 |
var networkStateLiveData = NetworkStateLiveData(applicationContext) networkStateLiveData.observe(this@NetworkActivity, Observer { networkState -> if (networkState) { // ネットワークに接続した場合 snackbarViewModel.showSnackBar("ネットワークに接続しました") } else { // ネットワークから切断した場合 snackbarViewModel.showSnackBar("ネットワークが切断されています") } }) |
これで端末のWifiが接続または切断されたことが検知できるようになります。
※今回は例として検知後SnackBarを表示しています。
◎参考記事
【Android】ExtensionとLiveDataを使ってSnackbarを表示する