Connectivity Managerは、デバイスのネットワーク接続状態に関する情報をアプリケーションに提供するAndroidシステムサービスです。インターネットの可用性の確認、ネットワークタイプ(Wi-Fi、モバイルデータ、Ethernet)の判別、接続変更の追跡、および接続品質に基づいたネットワークリクエストの管理が可能です。Android Developers、2025によると、ConnectivityManagerはネットワーク監視の主要APIであり、API Level 1からAndroid Frameworkの一部となっています。
主要ポイント
ConnectivityManagerは、Androidオペレーティングシステムのシステムサービスであり、Context.getSystemService(Context.CONNECTIVITY_SERVICE)を介してアクセスできます。デバイスのネットワーク接続に関する情報を取得し、ネットワーク変更を監視し、アプリケーションのネットワークリクエストを管理するためのAPIを提供します。Connectivity Managerは、プラットフォームの最初のバージョン(API Level 1)からAndroid Frameworkの一部であり、長年にわたって単純なgetActiveNetworkInfo()からNetworkCallbackとNetworkRequestを用いた最新のリアクティブモデルへと大きく変化してきました。
Connectivity Managerの主な機能には、アクティブなネットワーク接続の有無の確認、ネットワークタイプ(Wi-Fi、モバイルデータ、Ethernet、Bluetooth、VPN)の判別、リアルタイムでのネットワーク状態変更の監視、帯域幅とレイテンシに関する情報の取得、アプリケーションのネットワークリクエストの管理が含まれます。ConnectivityManagerは、WorkManagerやRepositoryと組み合わせて、Offline-Firstアーキテクチャ、適応型コンテンツ読み込み、接続品質に基づくアプリケーション最適化を実装するために使用されます。
Android 10(API 29)以降、GoogleはConnectivityManagerの扱い方を変更しました。getActiveNetworkInfo()メソッドは非推奨と宣言され、代わりにNetworkRequestと共にregisterDefaultNetworkCallback()またはregisterNetworkCallback()を使用することが推奨されています。新しいAPIは、キャプティブポータル(認証付きWi-Fi)の検出や接続品質の評価を含む、より詳細なネットワーク情報を提供します。ConnectivityManagerはJetpackファミリーとも統合されています。ConnectivityManagerライブラリは2024年に、Composeアプリケーションでのネットワーク監視を簡素化するためにJetpackの一部としてリリースされました。
最新のAndroidアーキテクチャでは、Connectivity Managerはネットワークリクエストに関する決定を行うためにリポジトリまたはUseCaseレベルで使用されます。リポジトリレイヤーはAPIを呼び出す前にネットワーク状態を確認します。ネットワークが利用できない場合は、ローカルストレージ(Room)からデータが返されます。ネットワークが利用可能な場合は、サーバーにリクエストが行われ、結果がRoomに保存されます。ViewModelはRoomからのFlowにサブスクライブし、ネットワーク相互作用の詳細を知りません — これにより、各レイヤーを独立してテストできます。
Connectivity Managerは、Linuxカーネルのネットワークインターフェースと相互作用するconnectivityシステムサービスからネットワーク状態情報を取得します。デバイスがWi-Fiに接続するかモバイルデータをオンにすると、カーネルがシステムサービスに通知し、システムサービスは内部状態を更新して、登録されたすべてのコールバックに通知します。ConnectivityManagerのアーキテクチャはObserverパターンに基づいています。アプリケーションはNetworkCallbackを登録し、ネットワークの変更(接続確立、切断、ネットワークタイプの変更、品質低下)に関する通知を受け取ります。
最新のConnectivityManager APIは、ネットワークイベントをフィルタリングするためにNetworkRequestを使用します。NetworkRequestを使用すると、ネットワークの要件(Transport.WIFI、Transport.CELLULAR、Transport.ETHERNETなどのトランスポート、NetworkCapabilities.NET_CAPABILITY_INTERNETなどのインターネット能力、その他の基準)を指定できます。大きなファイルをダウンロードするためにWi-Fiのみが必要なアプリケーションは、Transport.WIFIを指定したNetworkRequestを作成し、コールバックを登録します。システムは、Wi-Fi接続が変更された場合のみアプリケーションに通知し、モバイルネットワークイベントは無視します。
Android 12+のConnectivity Managerの重要な機能は、能力ベースのネットワーキングです。アプリケーションは単に「インターネットがあるか」を確認するだけでなく、どのようなタイプのトラフィックが利用可能かを評価できます。たとえば、NET_CAPABILITY_NOT_METEREDは従量制でない接続(Wi-Fi)を示し、NET_CAPABILITY_NOT_ROAMINGはデバイスがローミング中でないことを示します。これにより、Wi-Fiでのみ動画をダウンロードする、ローミング中は同期を延期する、重要なリクエストにのみモバイルデータを使用するなどの判断が可能になります。
| API Level | 推奨メソッド | ステータス |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | 非推奨 |
| 21+ | NetworkCallback + registerNetworkCallback() | 推奨 |
| 24+ | registerDefaultNetworkCallback() | 推奨 |
| 28+ | getActiveNetwork() + NetworkCapabilities | 代替 |
| 31+ | registerBestMatchingNetworkCallback() | 新しいAPI |
AndroidアプリケーションでConnectivity Managerを使用するには権限が必要です。ACCESS_NETWORK_STATEはネットワーク情報を読み取るための必須権限であり、AndroidManifest.xmlで宣言します。この権限がないと、ConnectivityManagerはgetActiveNetwork()でnullを返し、コールバックを呼び出しません。ネットワーク操作を実行するにはINTERNET権限も必要です。Android 10(API 29)以降、アプリケーションは追加のランタイム権限なしでネットワーク状態を確認できます — ACCESS_NETWORK_STATEは通常の権限であり、インストール時に自動的に付与されます。
最新のConnectivity Managerは、ネットワークを操作するためのいくつかの主要メソッドを提供します。getActiveNetwork()(API 23+)は、現在のアクティブネットワークのNetworkオブジェクトを返すか、デバイスが接続されていない場合はnullを返します。このメソッドはコールバックを必要とせず、1回限りの確認に適しています。NetworkオブジェクトはNetworkCapabilitiesに渡して、トランスポートタイプ、従量制ステータス、ローミング、インターネット能力などの詳細情報を取得できます。
registerDefaultNetworkCallback()(API 24+)はネットワーク監視の推奨方法です。アプリケーションは、デフォルトネットワーク(アプリケーションがトラフィックを送信するネットワーク)に変更があった場合に呼び出されるコールバックを登録します。コールバックは、ソケットやHTTPクライアントをバインドするために使用できるNetworkオブジェクトを受け取ります。このメソッドは非推奨のgetActiveNetworkInfo()を置き換え、ポーリングなしのリアクティブなネットワーク監視を提供します。
registerNetworkCallback()(API 21+)は、NetworkRequestを介して特定のネットワークタイプの変更にサブスクライブできます。たとえば、アプリケーションはnew NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()を使用してWi-Fiネットワークのみを追跡できます。システムは、モバイルネットワークイベントに影響を与えずにWi-Fiの接続/切断についてアプリケーションに通知します。NetworkCapabilities.getLinkDownstreamBandwidthKbps()は、下り帯域幅の推定値をkbit/sで返し、接続速度に応じてコンテンツ品質を適応させることを可能にします。
| メソッド | 最小API | 目的 |
|---|---|---|
| getActiveNetwork() | 23 | 現在のアクティブネットワークを取得 |
| getNetworkCapabilities() | 21 | ネットワーク能力を取得(タイプ、従量制、ローミング) |
| registerDefaultNetworkCallback() | 24 | デフォルトネットワークを監視 |
| registerNetworkCallback() | 21 | NetworkRequestフィルターでネットワークを監視 |
| unregisterNetworkCallback() | 21 | コールバックの登録を解除 |
| getActiveNetworkInfo() | 1 | 非推奨、使用しないでください |
Jetpack Connectivityライブラリ(androidx.core:core-ktx)は、ComposeでConnectivityManagerを操作するための便利な拡張機能を提供します。ConnectivityManager.observeAsState()関数は、ネットワークが変更されると更新されるState
ConnectivityManager.NetworkCallbackは、ネットワーク状態が変化したときにシステムによって呼び出されるメソッドを持つ抽象クラスです。onAvailable(Network) — ネットワークが利用可能になったときに呼び出されます。アプリケーションはNetwork.bindSocket()を介してソケットをバインドするために使用できるNetworkオブジェクトを受け取ります。onLost(Network) — ネットワークが利用できなくなったときに呼び出されます。アプリケーションはローカルデータに切り替えるか、接続がない旨のメッセージを表示する必要があります。onCapabilitiesChanged(Network, NetworkCapabilities) — ネットワーク特性が変更されたときに呼び出されます(たとえば、Wi-Fiからモバイルデータに切り替えた場合)。
ネットワーク変更を適切に処理するには、コンポーネントのライフサイクルを考慮する必要があります。コールバックは登録する必要があります onStart()/onResume()で登録し、onStop()/onPause()で解除します。コールバックが解除されないと、Activityが破棄された後も実行され続け、メモリリークや、破棄されたコンポーネントのUIを更新しようとしたときのNullPointerExceptionを引き起こす可能性があります。自動登録管理にはlifecycleScopeまたはrepeatOnLifecycleを使用してください。Jetpack Composeでは、コールバックの登録と解除にDisposableEffectを使用します。
キャプティブポータルの処理は、Android 10以降のConnectivityManagerの重要な機能です。CAPTIVE_PORTALは、Wi-Fiネットワークが利用可能だが、Webページを介した認証が必要なシナリオです(空港、ホテル、カフェ)。NetworkCapabilities.NET_CAPABILITY_VALIDATEDは、ネットワークが完全なインターネットアクセスを持つことを示します。NET_CAPABILITY_VALIDATEDがない場合、アプリケーションはキャプティブポータル認証のためにブラウザを開くことができます。Android 11(API 30)で追加されたisCaptivePortal()メソッドは、キャプティブポータルを検出するために使用されます。
ConnectivityManagerは、requestNetwork()とbindProcessToNetwork()を介して特定の目的のためのネットワークを要求できます。たとえば、大きなファイルをダウンロードするアプリケーションは、モバイルデータがアクティブでもWi-Fiネットワークを要求できます。これを行うには、addTransportType(TRANSPORT_WIFI)を指定したNetworkRequestを作成し、Wi-Fiが利用可能になるとシステムがonAvailable()を呼び出します。アプリケーションは、network.bindSocket()または設定されたNetworkオブジェクトを使用したOkHttpを介して、このネットワークにソケットをバインドします。これにより、ネットワークインターフェースの使用を柔軟に制御できます。
Clean Architectureで最新API(NetworkCallback)を使用したConnectivityManagerの完全な例を見てみましょう。NetworkMonitorはConnectivityManagerをラップするクラスで、StateFlowを介してリアクティブなネットワークステータスを提供します。ViewModelはこのFlowにサブスクライブし、状態をUIに渡します。RepositoryはNetworkMonitorを使用してネットワークリクエストに関する決定を行います。このアプローチにより、テスト容易性とプラットフォーム依存性の分離が保証されます。
以下の例は、registerDefaultNetworkCallbackを使用してConnectivityManagerを正しく使用する方法を示しています。NetworkMonitorクラスはシステムサービスとの連携をカプセル化し、クリーンなKotlin Flow
class NetworkMonitor(
private val connectivityManager: ConnectivityManager
) {
val isOnline: StateFlow<Boolean> = callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(true)
}
override fun onLost(network: Network) {
trySend(false)
}
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val connected = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
trySend(connected)
}
}
connectivityManager.registerDefaultNetworkCallback(callback)
awaitClose {
connectivityManager.unregisterNetworkCallback(callback)
}
}.stateIn(
CoroutineScope(Dispatchers.Default),
SharingStarted.WhileSubscribed(5000),
initialValue = checkInitialState()
)
private fun checkInitialState(): Boolean {
val network = connectivityManager.getActiveNetwork() ?: return false
val caps = connectivityManager.getNetworkCapabilities(network) ?: return false
return caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
}
}
ViewModelはNetworkMonitor.isOnlineにstateIn()を介してサブスクライブし、状態をComposeに渡します。RepositoryはAPIを呼び出す前に現在のisOnline.valueを確認します。falseの場合はRoomからFlowを返し、trueの場合はAPIを呼び出し、結果をRoomに保存してRoomからFlowを返します。WorkManagerはバックグラウンドタスクを制限するためにNetworkType.CONNECTEDを使用します。NetworkMonitorのテストは、モックのConnectivityManagerオブジェクトとfakeのNetworkCallbackを使用して行われ、単体テストで任意のネットワークシナリオをエミュレートできます。
ConnectivityManagerを扱う最初のルールは、非推奨のAPIを使用しないことです。getActiveNetworkInfo()はAPI 29から非推奨であり、新しいAndroidバージョンでは誤ったデータを返す可能性があります。代わりに、1回限りの確認にはgetActiveNetwork() + getNetworkCapabilities()を、継続的な監視にはregisterDefaultNetworkCallback()を使用してください。古いメソッドは、キャプティブポータルがあるネットワークと完全なインターネットアクセスがあるネットワークを区別せず、誤検出を引き起こします。
2番目のルールは、常にコールバックの登録を解除することです。ActivityがonStart()でNetworkCallbackを登録してもonStop()で解除しない場合、コールバックはActivityが破棄された後も実行され続けます。これによりメモリリークや、破棄されたコンポーネントのUIを更新しようとしたときのNullPointerExceptionが発生します。自動登録管理にはlifecycleScopeまたはrepeatOnLifecycleを使用してください。Jetpack Composeでは、コールバックの登録と解除にDisposableEffectを使用します。
3番目のよくある間違いは、品質を考慮せずにネットワークの可用性のみを確認することです。単なる「インターネットはあるか」だけでは判断には不十分です。アプリケーションは、大きなファイルのダウンロードにはNET_CAPABILITY_NOT_METERED、バックグラウンド同期にはNET_CAPABILITY_NOT_ROAMING、インターネットアクセスの確認にはNET_CAPABILITY_VALIDATEDを確認する必要があります。これらのフラグを無視すると、アプリケーションがローミング中に動画をダウンロードしたり、ホテルのキャプティブポータルを介してデータを同期しようとしたりします。
4番目のルールは、特定のサーバーの可用性を確認するためにConnectivityManagerを使用しないことです。ConnectivityManagerはデバイスのネットワーク状態を報告しますが、サーバーにアクセスできることを保証しません。APIの可用性を確認するには、短いタイムアウトのHTTPリクエストまたはヘルスチェックを使用してください。ConnectivityManager + HTTP pingは信頼性の高い組み合わせです。まずネットワークの存在を確認し、次にサーバーに軽量リクエストを送信して実際の到達可能性を確認します。
単体テストでは、ネットワーク状態をエミュレートできるShadowConnectivityManagerと共にRobolectricを使用します。統合テストでは、機内モードを切り替えるAndroid Test Orchestratorを使用します。テストでは、オンラインからオフラインへの移行、モバイルデータアクティブ時のWi-Fi出現、リクエスト中のネットワーク損失、キャプティブポータル、ローミングなどのシナリオを確認します。単体テストでのモッキングには、プラットフォーム依存性なしでモックオブジェクトに置き換え可能なラッパーインターフェース(NetworkMonitorInterfaceなど)を使用します。
よくある質問
最新の方法は、onCapabilitiesChanged()でNET_CAPABILITY_INTERNETを確認するregisterDefaultNetworkCallback()を使用することです。1回限りの確認:connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false。非推奨のgetActiveNetworkInfo()メソッドはAPI 29+から推奨されません。
ネットワーク情報を読み取るには、android.permission.ACCESS_NETWORK_STATE権限が必要です。これは通常の権限であり、アプリケーションのインストール時に自動的に付与され、ランタイムリクエストは必要ありません。ネットワーク操作(HTTPリクエスト)を実行するには、INTERNET権限も必要です。
registerDefaultNetworkCallback()はデフォルトネットワークを監視します — アプリケーションがメイントラフィックを送信するネットワークです。registerNetworkCallback(NetworkRequest)は、指定されたフィルター(Wi-Fiのみなど)に一致するネットワークを監視します。デフォルトコールバックはよりシンプルで90%のシナリオをカバーしますが、カスタムリクエストは特定のネットワークタイプ要件のためのものです。
NetworkCapabilitiesを使用します:Wi-Fiの場合はcaps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)、モバイルデータの場合はhasTransport(TRANSPORT_CELLULAR)。ConnectivityManager.getActiveNetworkInfo().getType()は使用しないでください — このメソッドは非推奨です。NetworkCapabilitiesはconnectivityManager.getNetworkCapabilities(network)を介して利用できます。
getActiveNetworkInfo()は不正確さのため非推奨です。キャプティブポータルがあるネットワークと完全なインターネットアクセスがあるネットワークを区別できず、帯域幅やローミング情報を提供しません。Android 10以降、このメソッドはマルチネットワーク接続でnullや誤ったデータを返す可能性があります。代替はgetActiveNetwork() + NetworkCapabilitiesです。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。