接続のステータスと種類をモニタリングする

ConnectivityManager には、デバイスの機能やデータ転送オプションなど、さまざまな条件に基づいてデバイスをネットワークに接続するようリクエストできる API が用意されています。

コールバックの実装により、デバイスの接続ステータスと、現在接続されているネットワークの機能に関する情報がアプリに提供されます。この API を使用すると、デバイスがアプリの要件を満たすネットワークに現在接続されているかどうかを判断できます。

ネットワーク リクエストを構成する

ネットワークのトランスポート タイプ(Wi-Fi 接続やモバイル接続など)と、現在接続されているネットワークの機能(インターネット接続など)を指定するには、ネットワーク リクエストを構成する必要があります。

アプリのネットワーク接続のニーズを記述する NetworkRequest を宣言します。次のコードは、インターネットに接続され、トランスポート タイプに Wi-Fi、イーサネット、またはモバイル接続を使用するネットワークのリクエストを作成します。

private val networkRequest = NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
    .build()

接続によっては、他の接続よりも大幅にコストが高くなる場合があります(たとえば、モバイル接続は通常、コストが高くなります)。NetworkCapabilities#NET_CAPABILITY_NOT_METERED を使用して、接続にコストがかかるかどうかを判断します。従量制接続の場合は、アプリのデータ消費量を減らすか、デバイスが非従量制接続になるまでデータ消費を遅らせるようにします。

ネットワーク コールバックを構成する

ConnectivityManager に NetworkRequest を登録する際は、接続ステータスとネットワーク機能の変更に関する通知を受け取るために、NetworkCallback を実装する必要があります。

NetworkCallback で最も一般的に実装される関数は次のとおりです。

  • onAvailable() は、デバイスが NetworkRequest で指定された機能とトランスポート タイプの要件を満たす新しいネットワークに接続されていることを示します。
  • onLost() は、デバイスがネットワークに接続されていないことを示します。
  • onCapabilitiesChanged() は、ネットワークの機能が変更されたことを示します。NetworkCapabilities オブジェクトは、ネットワークの現在の機能に関する情報を提供します。

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        // Network is available for use.
    }

    // Network capabilities have changed for the network.
    override fun onCapabilitiesChanged(
        network: Network,
        networkCapabilities: NetworkCapabilities
    ) {
        val unmetered =
            networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
        if (!unmetered) {
            // Reduce data usage, or delay it until the network is unmetered.
        }
    }

    override fun onLost(network: Network) {
        // Lost network connection.
    }
}

ネットワークの更新に登録する

NetworkRequest と NetworkCallback を宣言したら、requestNetwork() 関数または registerNetworkCallback() 関数を使用して、NetworkRequest を満たすデバイスから接続するネットワークを検索します。ステータスは NetworkCallback に報告されます。

val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)