NetworkCallback: その概要、適用、Androidでのネットワーク処理

著者: IT Sectr 公開日: 2026-03-10 読了時間: 9 分

NetworkCallbackは、ConnectivityManagerを通じてネットワーク状態の変化を監視するためのAndroid SDKの抽象クラスです。Android Developers Documentation (2025)によると、NetworkCallbackを使用すると、アプリは接続、切断、または接続特性の変更に迅速に対応できます。ConnectivityManager.NetworkCallbackは、システムサービスを常にポーリングすることなく、ネットワークタイプ、キャプティブポータル、インターネット損失に関する詳細情報を提供します。

重要ポイント

  • NetworkCallbackは、ConnectivityManagerを通じてネットワーク状態を追跡するためのAndroid SDKに組み込まれた抽象クラスです。
  • onAvailableメソッドは、デバイスがネットワークに接続したときに呼び出され、接続の詳細を含むNetworkオブジェクトを渡します。
  • onLostメソッドは、ネットワーク接続が失われたときにトリガーされ、アプリがネットワークリクエストを停止できるようにします。
  • onCapabilitiesChangedメソッドは、ネットワーク機能の変更(インターネットの利用可能性、キャプティブポータル、従量制接続)を通知します。
  • 登録はregisterNetworkCallbackを介して行われ、解除はアプリのライフサイクル内でunregisterNetworkCallbackを介して行われます。

NetworkCallbackとは?

NetworkCallbackは、android.netパッケージの抽象クラスで、Android SDKの一部です。ConnectivityManagerシステムサービスを通じてネットワーク接続状態の変更に関する通知を受け取るように設計されています。

NetworkCallback以前は、開発者はBroadcastReceiverを使用してネットワーク変更を追跡していました。このアプローチではマニフェストへの常時登録が必要で、遅延が発生し、接続特性に関する詳細情報を提供しませんでした。Android 5.0(API 21)は、より柔軟で高性能な代替手段としてNetworkCallbackを導入しました。

コールバックは非同期的に動作します。アプリはConnectivityManagerを介してイベントをサブスクライブし、ネットワーク状態が変化するとシステムがコールバックメソッドを呼び出します。これにより、ネットワークステータスの定期的なポーリングが不要になり、バッテリーとCPUリソースを節約できます。

Androidでのコールバックの仕組み

ConnectivityManagerは、デバイスのすべてのネットワークインターフェース(Wi-Fi、モバイルデータ、Ethernet、VPN)を管理します。これらのインターフェースのいずれかが変更されると、システムはNetworkオブジェクトを作成し、登録されたコールバックの対応するメソッドに渡します。各Networkには一意の識別子があり、再接続時に変更されます。

コールバックは特定のネットワークタイプに限定されません。すべての利用可能なインターフェースを同時に追跡できます。接続タイプをフィルタリングするには、NetworkRequestクラスを使用して、必要なトランスポートプロトコル(Wi-Fi、セルラーデータ、Ethernet)とネットワーク機能を指定します。

アプリでNetworkCallbackを登録する方法

NetworkCallbackの登録は、ConnectivityManager.registerNetworkCallbackメソッドを介して行われます。最初のパラメータはネットワーク要件を記述するNetworkRequest.Builder、2番目はコールバックインスタンスです。マニフェストにACCESS_NETWORK_STATE権限が必要です。

kotlin
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)
    }
}

ActivityとFragmentでの登録

アプリがフォアグラウンドにあるときにNetworkCallbackを登録し、バックグラウンドに移動するときに解除することをお勧めします。Activityでは、onStartとonStopを使用してコールバックのライフサイクルを管理します。Fragmentでは、onResumeとonPauseを使用します。

登録管理を簡素化するには、Lifecycle対応コンポーネントを使用できます。AndroidX Lifecycleライブラリを使用すると、ライフサイクル状態が変化したときに自動的にコールバックを登録および解除するカスタムLifecycleObserverを作成できます。

Serviceでの登録

バックグラウンドタスクの場合、登録はServiceまたはWorkManagerで行われます。Android 8+では、バックグラウンドサービスに起動制限があることに注意してください。NetworkTypeを使用したWorkManagerは、特定のネットワーク状態でタスクを実行するためのより信頼性の高い方法です。互換性APIと統合され、Dozeモードを尊重します。

NetworkCallbackの主要メソッド

NetworkCallbackは、ネットワーク状態が変化したときに呼び出される一連のメソッドを提供します。すべてのメソッドをオーバーライドする必要はなく、アプリの特定のタスクに必要なものだけを実装します。onAvailableとonLostは、基本的な接続監視に最低限必要です。

メソッド呼び出しタイミングパラメータ
onAvailableネットワークが使用可能Network — ネットワークオブジェクト
onLostネットワークが失われたか切断されたNetwork — ネットワークオブジェクト
onCapabilitiesChangedネットワーク機能が変更されたNetwork, NetworkCapabilities
onBlockedStatusChangedブロッキングステータスが変更されたNetwork, Boolean
onNetworkSuspendedシステムによってネットワークが一時停止Network
onNetworkResumed一時停止後にネットワークが再開Network

onCapabilitiesChangedメソッド

このメソッドは、ネットワークの詳細情報を取得するための鍵です。NetworkCapabilitiesパラメータにはフラグが含まれます:NET_CAPABILITY_INTERNET — インターネットアクセス可能、NET_CAPABILITY_NOT_METERED — 無制限接続、NET_CAPABILITY_NOT_ROAMING — ローミングなし。信号遅延と帯域幅も確認できます。

キャプティブポータルは特殊なケースです。ポータルを介して公共Wi-Fiネットワークに接続する場合、onCapabilitiesChangedメソッドはすぐにINTERNETを表示しません。ネットワークは最初に利用可能ですが、インターネットなしの状態です。ブラウザを介した認証が必要です。開発者はアプリのロジックでこの遅延を考慮する必要があります。

onBlockedStatusChangedメソッド

システムがアプリのネットワークトラフィックをブロックしたときに呼び出されます。例えば、データセーバーモードが有効になったり、バックグラウンドデータが制限されたりした場合です。onBlockedStatusChangedは、アプリにネットワークリクエストが一時的に禁止されていることを知らせ、ローカル処理に切り替えることを可能にします。

NetworkCallback実装例

インターネットアクセスの監視とキャプティブポータルの処理のための実用的なNetworkCallback実装を見てみましょう。以下の例は、NET_CAPABILITY_INTERNETの確認とGoogleサーバーへのHTTPリクエストによる接続検証を示しています。

kotlin
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を開いて、ポータル認証を完了できます。

kotlin
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遅延詳細レベル消費電力
BroadcastReceiver1+高い低い高い
NetworkCallback21+低い高い低い
ConnectivityManager.getActiveNetwork23+即時中程度ゼロ
NWPathMonitor (iOS)iOS 12+低い高い低い

バックグラウンドモードでの動作

Android 10以降、バックグラウンド制限が厳しくなり、アプリがバックグラウンドにあるときにNetworkCallbackが呼び出されない場合があります。ネットワークが利用可能になったときのデータ読み込みなどの重要なタスクには、NetworkType.CONNECTED制約付きのWorkManagerを使用してください。WorkManagerは、ネットワーク条件が満たされたときにタスクの実行を保証します。

Android 12+では、CONNECTIVITY_ACTIONに対するBroadcastReceiverのマニフェスト登録に制限があります。開発者はNetworkCallbackに移行するか、WorkManagerを使用する必要があります。Google Playポリシーは2022年8月以降、このアクションに対するマニフェスト登録の削除を要求しています。

よくある質問

ネットワークに関するNetworkCallbackとBroadcastReceiverの違いは?

CONNECTIVITY_CHANGEを使用したBroadcastReceiverは、詳細なしで、最大数秒の遅延を伴ってネットワーク変更の事実のみを提供します。NetworkCallbackは非同期で動作し、Networkオブジェクト、インターフェースタイプ、接続機能を提供し、Android 12+で禁止されているマニフェスト登録を必要としません。

NetworkCallbackはバックグラウンドで使用できますか?

Android 10+では、バックグラウンド制限によりNetworkCallbackの呼び出しが遅延または妨げられる可能性があります。バックグラウンドタスクには、NetworkType制約付きのWorkManagerを使用してください。省電力モードに関係なく、条件が満たされたときにタスクの実行を保証します。

NetworkCallbackの登録を解除するには?

ConnectivityManagerでunregisterNetworkCallbackメソッドを呼び出し、登録時に使用したものと同じコールバックインスタンスを渡します。未解除のコールバックは、システムがその参照を保持するため、メモリリークを引き起こす可能性があります。必ずonStopまたはonDestroyで解除してください。

NetworkCallbackに必要な最小Androidバージョンは?

NetworkCallbackはAPI Level 21(Android 5.0 Lollipop)から利用可能です。より古いバージョンのデバイスでは、BroadcastReceiverまたはAndroidX Activity NetworkCallbackなどの互換性ライブラリを使用してください。これらはより広いサポートのためにAPIをラップします。

コールバックなしで現在のネットワーク状態を確認するには?

ConnectivityManager.getActiveNetwork(API 23+)をgetNetworkCapabilitiesと組み合わせて使用します。このメソッドは、変更をサブスクライブせずに、同期的に現在のアクティブネットワークを返します。API 21-22の場合は、新しいバージョンで非推奨とマークされているgetActiveNetworkInfoを使用します。

まとめ

  • NetworkCallbackは、ConnectivityManagerを介して定期的なポーリングなしで非同期ネットワーク監視を行うためのAndroid SDKの抽象クラスです。
  • onAvailableメソッドはネットワーク接続を通知し、onLostは接続損失を、onCapabilitiesChangedはネットワーク機能の変更を通知します。
  • 登録は、NetworkRequestとコールバックインスタンスを使用してregisterNetworkCallbackを介して行われます。
  • ライフサイクルでは、ActivityのonStopとFragmentのonPauseでの登録解除が必要です。
  • キャプティブポータルは、実際のインターネットアクセスを確認するためにgenerate_204への追加HTTPリクエストを介して処理されます。
  • NetworkCallbackは、Android 12+のマニフェストで禁止されているCONNECTIVITY_ACTION用のBroadcastReceiverを置き換えました。
  • バックグラウンドタスクには、直接のNetworkCallback登録ではなく、NetworkType.CONNECTEDを使用したWorkManagerを使用してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください