NetworkCallback: что это, применение и обработка сети в Android

Автор: IT Sectr Опубликовано: 2026-03-10 Время чтения: 9 мин

NetworkCallback — абстрактный класс в Android SDK для мониторинга изменений состояния сети через ConnectivityManager. По данным Android Developers Documentation (2025), использование NetworkCallback позволяет приложению своевременно реагировать на подключение, отключение или изменение характеристик соединения. ConnectivityManager.NetworkCallback даёт детальную информацию о типе сети, каптивных порталах и потере интернета без постоянного опроса системного сервиса.

Главное

  • NetworkCallback — встроенный абстрактный класс Android SDK для отслеживания состояния сети через ConnectivityManager.
  • Метод onAvailable вызывается при подключении устройства к сети, передавая объект Network с деталями соединения.
  • Метод onLost срабатывает при потере сетевого подключения, позволяя приложению остановить сетевые запросы.
  • Метод onCapabilitiesChanged уведомляет об изменении возможностей сети — появлении интернета, каптивного портала или платного соединения.
  • Регистрация выполняется через registerNetworkCallback, отмена — через unregisterNetworkCallback в lifecycle приложения.

Что такое NetworkCallback?

NetworkCallback — это абстрактный класс из пакета android.net, входящий в состав Android SDK. Он предназначен для получения уведомлений об изменениях состояния сетевого соединения через системный сервис ConnectivityManager.

До появления NetworkCallback разработчики использовали широковещательные приёмники BroadcastReceiver для отслеживания сети. Такой подход требовал постоянной регистрации в манифесте, работал с задержкой и не давал детальной информации о характеристиках соединения. Android 5.0 (API 21) представил NetworkCallback как более гибкую и производительную альтернативу.

Callback работает асинхронно: приложение подписывается на события через ConnectivityManager, и система вызывает методы callback при изменении состояния сети. Это исключает необходимость периодического опроса (polling) сетевого статуса, экономя ресурсы батареи и процессора.

Как работает callback в Android

ConnectivityManager управляет всеми сетевыми интерфейсами устройства — Wi-Fi, мобильными данными, Ethernet, VPN. При изменении любого из этих интерфейсов система формирует объект Network и передаёт его в соответствующий метод зарегистрированного callback. Каждый Network имеет уникальный идентификатор, который меняется при переподключении.

Callback не привязан к конкретному типу сети — он может отслеживать все доступные интерфейсы одновременно. Для фильтрации типов соединений используется класс NetworkRequest, где указываются требуемые транспортные протоколы (Wi-Fi, сотовые данные, Ethernet) и возможности сети.

Как зарегистрировать NetworkCallback в приложении

Регистрация NetworkCallback выполняется через метод ConnectivityManager.registerNetworkCallback. Первым параметром передаётся NetworkRequest.Builder, описывающий требования к сети, вторым — экземпляр callback. Для работы требуется разрешение 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 для управления жизненным циклом callback. В Fragment — onResume и onPause.

Для упрощения управления регистрацией можно использовать Lifecycle-aware компоненты. Библиотека AndroidX Lifecycle позволяет создать собственный LifecycleObserver, который автоматически регистрирует и отменяет callback при изменении состояния жизненного цикла.

Регистрация в сервисе

Для фоновых задач регистрация выполняется в Service или WorkManager. Важно учитывать, что в Android 8+ фоновые сервисы имеют ограничения на запуск. WorkManager с NetworkType — более надёжный способ для выполнения задач при определённом состоянии сети, так как он интегрирован с 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 — отсутствие роуминга. Также можно узнать задержку сигнала и пропускную способность.

Каптивные порталы (captive portals) — отдельный случай: при подключении к публичной Wi-Fi сети через портал метод onCapabilitiesChanged не сразу показывает INTERNET. Сначала сеть доступна, но без интернета — требуется авторизация через браузер. Разработчику нужно учитывать эту задержку в логике приложения.

Метод onBlockedStatusChanged

Вызывается, когда система блокирует сетевой трафик для приложения — например, при включении режима экономии трафика или ограничении фоновых данных. onBlockedStatusChanged позволяет приложению узнать, что его сетевые запросы временно запрещены, и переключиться на локальную обработку.

Примеры реализации NetworkCallback

Рассмотрим практическую реализацию NetworkCallback для отслеживания доступа в интернет и обработки каптивных порталов. В примере ниже показана проверка NET_CAPABILITY_INTERNET и валидация соединения через HTTP-запрос к серверу Google.

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. В таких случаях требуется дополнительная проверка через HTTP-запрос к стабильному эндпоинту, например https://www.google.com/generate_204.

Если запрос возвращает код 204 — интернет есть. Если редирект (301, 302, 307) — требуется авторизация через браузер. В этом случае можно открыть WebView или Intent на URL редиректа для прохождения аутентификации на портале.

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 основным способом мониторинга сети был BroadcastReceiver с фильтром android.net.conn.CONNECTIVITY_CHANGE. Этот подход имел существенные недостатки: задержка в несколько секунд, отсутствие информации о типе интерфейса, повышенное энергопотребление из-за постоянного пробуждения устройства.

Современная альтернатива — LiveData или StateFlow в паре с NetworkCallback. Паттерн заключается в обёртке callback в реактивный стрим, который автоматически уведомляет UI об изменении состояния. Например, MutableStateFlow с типом NetworkStatus обновляется внутри методов callback, а ViewCollector подписывается на изменения.

МетодAPI LevelЗадержкаДетализацияЭнергопотребление
BroadcastReceiver1+высокаянизкаявысокое
NetworkCallback21+низкаявысокаянизкое
ConnectivityManager.getActiveNetwork23+мгновеннаясредняянулевое
NWPathMonitor (iOS)iOS 12+низкаявысокаянизкое

Работа с фоновым режимом

Начиная с Android 10 уровень фоновых ограничений ужесточён, и NetworkCallback может не вызываться, когда приложение в фоне. Для критически важных задач — например, загрузка данных при появлении сети — используйте WorkManager с ограничением NetworkType.CONNECTED. WorkManager гарантирует выполнение задачи при соблюдении условий сети.

В Android 12+ появилось ограничение на манифест-регистрацию BroadcastReceiver для CONNECTIVITY_ACTION. Разработчики обязаны мигрировать на NetworkCallback или использовать WorkManager. Google Play политика с августа 2022 требует удаления манифест-регистрации для этого действия.

Часто задаваемые вопросы

В чём разница между NetworkCallback и BroadcastReceiver для сети?

BroadcastReceiver с CONNECTIVITY_CHANGE даёт только факт изменения сети без деталей и с задержкой до нескольких секунд. NetworkCallback работает асинхронно, предоставляет объект Network, тип интерфейса, возможности соединения и не требует манифест-регистрации, которая запрещена в Android 12+.

Можно ли использовать NetworkCallback в фоновом режиме?

В Android 10+ фоновые ограничения могут задерживать или не вызывать NetworkCallback. Для фоновых задач используйте WorkManager с ограничением NetworkType — он гарантированно выполнит работу при соблюдении условий независимо от режима энергосбережения.

Как отменить регистрацию NetworkCallback?

Вызовите метод unregisterNetworkCallback у ConnectivityManager, передав тот же экземпляр callback, который использовали при регистрации. Неотменённый callback может вызвать утечку памяти, так как система хранит ссылку на него. Всегда отменяйте в onStop или onDestroy.

Какая версия Android минимально требуется для NetworkCallback?

NetworkCallback доступен начиная с API Level 21 (Android 5.0 Lollipop). Для устройств с более старыми версиями используйте BroadcastReceiver или библиотеки совместимости, такие как AndroidX Activity NetworkCallback, оборачивающие API для более широкой поддержки.

Как проверить текущее состояние сети без callback?

Используйте ConnectivityManager.getActiveNetwork (API 23+) вместе с getNetworkCapabilities. Метод возвращает текущую активную сеть синхронно, без подписки на изменения. Для API 21-22 используйте getActiveNetworkInfo, который помечен как deprecated в более новых версиях.

Итоги

  • NetworkCallback — абстрактный класс Android SDK для асинхронного мониторинга сети через ConnectivityManager без постоянного опроса.
  • Метод onAvailable уведомляет о подключении к сети, onLost — о потере соединения, onCapabilitiesChanged — об изменении возможностей сети.
  • Регистрация выполняется через registerNetworkCallback с указанием NetworkRequest и экземпляра callback.
  • Жизненный цикл требует отмены регистрации в onStop для Activity и onPause для Fragment.
  • Каптивные порталы обрабатываются через дополнительный HTTP-запрос к generate_204 для проверки реального доступа в интернет.
  • NetworkCallback заменил BroadcastReceiver для CONNECTIVITY_ACTION, который запрещён в манифесте на Android 12+.
  • Для фоновых задач используйте WorkManager с NetworkType.CONNECTED вместо прямой регистрации NetworkCallback.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также