NetworkCallback — абстрактный класс в Android SDK для мониторинга изменений состояния сети через ConnectivityManager. По данным Android Developers Documentation (2025), использование NetworkCallback позволяет приложению своевременно реагировать на подключение, отключение или изменение характеристик соединения. ConnectivityManager.NetworkCallback даёт детальную информацию о типе сети, каптивных порталах и потере интернета без постоянного опроса системного сервиса.
Главное
NetworkCallback — это абстрактный класс из пакета android.net, входящий в состав Android SDK. Он предназначен для получения уведомлений об изменениях состояния сетевого соединения через системный сервис ConnectivityManager.
До появления NetworkCallback разработчики использовали широковещательные приёмники BroadcastReceiver для отслеживания сети. Такой подход требовал постоянной регистрации в манифесте, работал с задержкой и не давал детальной информации о характеристиках соединения. Android 5.0 (API 21) представил NetworkCallback как более гибкую и производительную альтернативу.
Callback работает асинхронно: приложение подписывается на события через ConnectivityManager, и система вызывает методы callback при изменении состояния сети. Это исключает необходимость периодического опроса (polling) сетевого статуса, экономя ресурсы батареи и процессора.
ConnectivityManager управляет всеми сетевыми интерфейсами устройства — Wi-Fi, мобильными данными, Ethernet, VPN. При изменении любого из этих интерфейсов система формирует объект Network и передаёт его в соответствующий метод зарегистрированного callback. Каждый Network имеет уникальный идентификатор, который меняется при переподключении.
Callback не привязан к конкретному типу сети — он может отслеживать все доступные интерфейсы одновременно. Для фильтрации типов соединений используется класс NetworkRequest, где указываются требуемые транспортные протоколы (Wi-Fi, сотовые данные, Ethernet) и возможности сети.
Регистрация NetworkCallback выполняется через метод ConnectivityManager.registerNetworkCallback. Первым параметром передаётся NetworkRequest.Builder, описывающий требования к сети, вторым — экземпляр callback. Для работы требуется разрешение 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 для управления жизненным циклом callback. В Fragment — onResume и onPause.
Для упрощения управления регистрацией можно использовать Lifecycle-aware компоненты. Библиотека AndroidX Lifecycle позволяет создать собственный LifecycleObserver, который автоматически регистрирует и отменяет callback при изменении состояния жизненного цикла.
Для фоновых задач регистрация выполняется в Service или WorkManager. Важно учитывать, что в Android 8+ фоновые сервисы имеют ограничения на запуск. WorkManager с NetworkType — более надёжный способ для выполнения задач при определённом состоянии сети, так как он интегрирован с 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 — отсутствие роуминга. Также можно узнать задержку сигнала и пропускную способность.
Каптивные порталы (captive portals) — отдельный случай: при подключении к публичной Wi-Fi сети через портал метод onCapabilitiesChanged не сразу показывает INTERNET. Сначала сеть доступна, но без интернета — требуется авторизация через браузер. Разработчику нужно учитывать эту задержку в логике приложения.
Вызывается, когда система блокирует сетевой трафик для приложения — например, при включении режима экономии трафика или ограничении фоновых данных. onBlockedStatusChanged позволяет приложению узнать, что его сетевые запросы временно запрещены, и переключиться на локальную обработку.
Рассмотрим практическую реализацию NetworkCallback для отслеживания доступа в интернет и обработки каптивных порталов. В примере ниже показана проверка NET_CAPABILITY_INTERNET и валидация соединения через HTTP-запрос к серверу Google.
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 редиректа для прохождения аутентификации на портале.
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 | Задержка | Детализация | Энергопотребление |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | высокая | низкая | высокое |
| NetworkCallback | 21+ | низкая | высокая | низкое |
| ConnectivityManager.getActiveNetwork | 23+ | мгновенная | средняя | нулевое |
| NWPathMonitor (iOS) | iOS 12+ | низкая | высокая | низкое |
Начиная с Android 10 уровень фоновых ограничений ужесточён, и NetworkCallback может не вызываться, когда приложение в фоне. Для критически важных задач — например, загрузка данных при появлении сети — используйте WorkManager с ограничением NetworkType.CONNECTED. WorkManager гарантирует выполнение задачи при соблюдении условий сети.
В Android 12+ появилось ограничение на манифест-регистрацию BroadcastReceiver для CONNECTIVITY_ACTION. Разработчики обязаны мигрировать на NetworkCallback или использовать WorkManager. Google Play политика с августа 2022 требует удаления манифест-регистрации для этого действия.
Часто задаваемые вопросы
BroadcastReceiver с CONNECTIVITY_CHANGE даёт только факт изменения сети без деталей и с задержкой до нескольких секунд. NetworkCallback работает асинхронно, предоставляет объект Network, тип интерфейса, возможности соединения и не требует манифест-регистрации, которая запрещена в Android 12+.
В Android 10+ фоновые ограничения могут задерживать или не вызывать NetworkCallback. Для фоновых задач используйте WorkManager с ограничением NetworkType — он гарантированно выполнит работу при соблюдении условий независимо от режима энергосбережения.
Вызовите метод unregisterNetworkCallback у ConnectivityManager, передав тот же экземпляр callback, который использовали при регистрации. Неотменённый callback может вызвать утечку памяти, так как система хранит ссылку на него. Всегда отменяйте в onStop или onDestroy.
NetworkCallback доступен начиная с API Level 21 (Android 5.0 Lollipop). Для устройств с более старыми версиями используйте BroadcastReceiver или библиотеки совместимости, такие как AndroidX Activity NetworkCallback, оборачивающие API для более широкой поддержки.
Используйте ConnectivityManager.getActiveNetwork (API 23+) вместе с getNetworkCapabilities. Метод возвращает текущую активную сеть синхронно, без подписки на изменения. Для API 21-22 используйте getActiveNetworkInfo, который помечен как deprecated в более новых версиях.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также