NetworkCallbackは、ConnectivityManagerを通じてネットワーク状態の変化を監視するためのAndroid SDKの抽象クラスです。Android Developers Documentation (2025)によると、NetworkCallbackを使用すると、アプリは接続、切断、または接続特性の変更に迅速に対応できます。ConnectivityManager.NetworkCallbackは、システムサービスを常にポーリングすることなく、ネットワークタイプ、キャプティブポータル、インターネット損失に関する詳細情報を提供します。
重要ポイント
NetworkCallbackは、android.netパッケージの抽象クラスで、Android SDKの一部です。ConnectivityManagerシステムサービスを通じてネットワーク接続状態の変更に関する通知を受け取るように設計されています。
NetworkCallback以前は、開発者はBroadcastReceiverを使用してネットワーク変更を追跡していました。このアプローチではマニフェストへの常時登録が必要で、遅延が発生し、接続特性に関する詳細情報を提供しませんでした。Android 5.0(API 21)は、より柔軟で高性能な代替手段としてNetworkCallbackを導入しました。
コールバックは非同期的に動作します。アプリはConnectivityManagerを介してイベントをサブスクライブし、ネットワーク状態が変化するとシステムがコールバックメソッドを呼び出します。これにより、ネットワークステータスの定期的なポーリングが不要になり、バッテリーとCPUリソースを節約できます。
ConnectivityManagerは、デバイスのすべてのネットワークインターフェース(Wi-Fi、モバイルデータ、Ethernet、VPN)を管理します。これらのインターフェースのいずれかが変更されると、システムはNetworkオブジェクトを作成し、登録されたコールバックの対応するメソッドに渡します。各Networkには一意の識別子があり、再接続時に変更されます。
コールバックは特定のネットワークタイプに限定されません。すべての利用可能なインターフェースを同時に追跡できます。接続タイプをフィルタリングするには、NetworkRequestクラスを使用して、必要なトランスポートプロトコル(Wi-Fi、セルラーデータ、Ethernet)とネットワーク機能を指定します。
NetworkCallbackの登録は、ConnectivityManager.registerNetworkCallbackメソッドを介して行われます。最初のパラメータはネットワーク要件を記述するNetworkRequest.Builder、2番目はコールバックインスタンスです。マニフェストにACCESS_NETWORK_STATE権限が必要です。
class NetworkMonitor(private val context: Context) {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
private val callback =
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d("Network", "Available: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Lost: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
アプリがフォアグラウンドにあるときにNetworkCallbackを登録し、バックグラウンドに移動するときに解除することをお勧めします。Activityでは、onStartとonStopを使用してコールバックのライフサイクルを管理します。Fragmentでは、onResumeとonPauseを使用します。
登録管理を簡素化するには、Lifecycle対応コンポーネントを使用できます。AndroidX Lifecycleライブラリを使用すると、ライフサイクル状態が変化したときに自動的にコールバックを登録および解除するカスタムLifecycleObserverを作成できます。
バックグラウンドタスクの場合、登録はServiceまたはWorkManagerで行われます。Android 8+では、バックグラウンドサービスに起動制限があることに注意してください。NetworkTypeを使用したWorkManagerは、特定のネットワーク状態でタスクを実行するためのより信頼性の高い方法です。互換性APIと統合され、Dozeモードを尊重します。
NetworkCallbackは、ネットワーク状態が変化したときに呼び出される一連のメソッドを提供します。すべてのメソッドをオーバーライドする必要はなく、アプリの特定のタスクに必要なものだけを実装します。onAvailableとonLostは、基本的な接続監視に最低限必要です。
| メソッド | 呼び出しタイミング | パラメータ |
|---|---|---|
| onAvailable | ネットワークが使用可能 | Network — ネットワークオブジェクト |
| onLost | ネットワークが失われたか切断された | Network — ネットワークオブジェクト |
| onCapabilitiesChanged | ネットワーク機能が変更された | Network, NetworkCapabilities |
| onBlockedStatusChanged | ブロッキングステータスが変更された | Network, Boolean |
| onNetworkSuspended | システムによってネットワークが一時停止 | Network |
| onNetworkResumed | 一時停止後にネットワークが再開 | Network |
このメソッドは、ネットワークの詳細情報を取得するための鍵です。NetworkCapabilitiesパラメータにはフラグが含まれます:NET_CAPABILITY_INTERNET — インターネットアクセス可能、NET_CAPABILITY_NOT_METERED — 無制限接続、NET_CAPABILITY_NOT_ROAMING — ローミングなし。信号遅延と帯域幅も確認できます。
キャプティブポータルは特殊なケースです。ポータルを介して公共Wi-Fiネットワークに接続する場合、onCapabilitiesChangedメソッドはすぐにINTERNETを表示しません。ネットワークは最初に利用可能ですが、インターネットなしの状態です。ブラウザを介した認証が必要です。開発者はアプリのロジックでこの遅延を考慮する必要があります。
システムがアプリのネットワークトラフィックをブロックしたときに呼び出されます。例えば、データセーバーモードが有効になったり、バックグラウンドデータが制限されたりした場合です。onBlockedStatusChangedは、アプリにネットワークリクエストが一時的に禁止されていることを知らせ、ローカル処理に切り替えることを可能にします。
インターネットアクセスの監視とキャプティブポータルの処理のための実用的なNetworkCallback実装を見てみましょう。以下の例は、NET_CAPABILITY_INTERNETの確認とGoogleサーバーへのHTTPリクエストによる接続検証を示しています。
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val hasInternet = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
val isMetered = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_METERED
).not()
when {
hasInternet && isMetered ->
Log.d("Network", "Mobile data connected")
hasInternet ->
Log.d("Network", "Wi-Fi connected")
else ->
Log.d("Network", "No internet access")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Connection lost: ${network}")
// ネットワークリクエストを停止
}
}
認証が必要な公共ネットワーク(カフェ、空港)に接続する場合、システムは最初にonAvailableを通知しますが、onCapabilitiesChangedはINTERNETを表示しないことがあります。そのような場合、https://www.google.com/generate_204のような安定したエンドポイントへのHTTPリクエストによる追加検証が必要です。
リクエストがコード204を返す場合 — インターネットは利用可能です。リダイレクト(301、302、307)がある場合 — ブラウザを介した認証が必要です。この場合、リダイレクトURLでWebViewまたはIntentを開いて、ポータル認証を完了できます。
fun Context.validateInternet(network: Network) {
CoroutineScope(Dispatchers.IO).launch {
try {
val url = URL("https://www.google.com/generate_204")
val connection =
network.openConnection(url) as HttpURLConnection
connection.instanceFollowRedirects = false
connection.connect()
when (connection.responseCode) {
HttpURLConnection.HTTP_NO_CONTENT ->
Log.d("Network", "Internet is available")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal detected")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Validation failed: ${e.message}")
}
}
}
NetworkCallback以前は、ネットワーク監視の主要な方法は、android.net.conn.CONNECTIVITY_CHANGEフィルターを使用したBroadcastReceiverでした。このアプローチには、数秒の遅延、インターフェースタイプ情報の欠如、デバイスの絶え間ない起動による電力消費の増加といった重大な欠点がありました。
現代的な代替方法は、LiveDataまたはStateFlowをNetworkCallbackと組み合わせることです。このパターンでは、コールバックをリアクティブストリームでラップし、状態の変更を自動的にUIに通知します。例えば、NetworkStatusタイプのMutableStateFlowがコールバックメソッド内で更新され、ViewCollectorが変更をサブスクライブします。
| 方法 | API Level | 遅延 | 詳細レベル | 消費電力 |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | 高い | 低い | 高い |
| NetworkCallback | 21+ | 低い | 高い | 低い |
| ConnectivityManager.getActiveNetwork | 23+ | 即時 | 中程度 | ゼロ |
| NWPathMonitor (iOS) | iOS 12+ | 低い | 高い | 低い |
Android 10以降、バックグラウンド制限が厳しくなり、アプリがバックグラウンドにあるときにNetworkCallbackが呼び出されない場合があります。ネットワークが利用可能になったときのデータ読み込みなどの重要なタスクには、NetworkType.CONNECTED制約付きのWorkManagerを使用してください。WorkManagerは、ネットワーク条件が満たされたときにタスクの実行を保証します。
Android 12+では、CONNECTIVITY_ACTIONに対するBroadcastReceiverのマニフェスト登録に制限があります。開発者はNetworkCallbackに移行するか、WorkManagerを使用する必要があります。Google Playポリシーは2022年8月以降、このアクションに対するマニフェスト登録の削除を要求しています。
よくある質問
CONNECTIVITY_CHANGEを使用したBroadcastReceiverは、詳細なしで、最大数秒の遅延を伴ってネットワーク変更の事実のみを提供します。NetworkCallbackは非同期で動作し、Networkオブジェクト、インターフェースタイプ、接続機能を提供し、Android 12+で禁止されているマニフェスト登録を必要としません。
Android 10+では、バックグラウンド制限によりNetworkCallbackの呼び出しが遅延または妨げられる可能性があります。バックグラウンドタスクには、NetworkType制約付きのWorkManagerを使用してください。省電力モードに関係なく、条件が満たされたときにタスクの実行を保証します。
ConnectivityManagerでunregisterNetworkCallbackメソッドを呼び出し、登録時に使用したものと同じコールバックインスタンスを渡します。未解除のコールバックは、システムがその参照を保持するため、メモリリークを引き起こす可能性があります。必ずonStopまたはonDestroyで解除してください。
NetworkCallbackはAPI Level 21(Android 5.0 Lollipop)から利用可能です。より古いバージョンのデバイスでは、BroadcastReceiverまたはAndroidX Activity NetworkCallbackなどの互換性ライブラリを使用してください。これらはより広いサポートのためにAPIをラップします。
ConnectivityManager.getActiveNetwork(API 23+)をgetNetworkCapabilitiesと組み合わせて使用します。このメソッドは、変更をサブスクライブせずに、同期的に現在のアクティブネットワークを返します。API 21-22の場合は、新しいバージョンで非推奨とマークされているgetActiveNetworkInfoを使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。