NetworkCallback — abstraktní třída v Android SDK pro monitorování změn stavu sítě přes ConnectivityManager. Podle Android Developers Documentation (2025) umožňuje použití NetworkCallback aplikaci včas reagovat na připojení, odpojení nebo změnu charakteristik spojení. ConnectivityManager.NetworkCallback poskytuje podrobné informace o typu sítě, captive portálech a ztrátě internetu bez neustálého dotazování systémové služby.
Hlavní body
NetworkCallback — je abstraktní třída z balíčku android.net, která je součástí Android SDK. Je určena k přijímání oznámení o změnách stavu síťového připojení prostřednictvím systémové služby ConnectivityManager.
Před příchodem NetworkCallback používali vývojáři vysílací přijímače BroadcastReceiver pro sledování sítě. Tento přístup vyžadoval neustálou registraci v manifestu, pracoval se zpožděním a neposkytoval podrobné informace o charakteristikách připojení. Android 5.0 (API 21) představil NetworkCallback jako flexibilnější a výkonnější alternativu.
Callback pracuje asynchronně: aplikace se přihlásí k událostem přes ConnectivityManager a systém volá metody callback při změně stavu sítě. To eliminuje potřebu periodického dotazování (polling) stavu sítě, čímž šetří baterii a procesorové zdroje.
ConnectivityManager spravuje všechna síťová rozhraní zařízení — Wi-Fi, mobilní data, Ethernet, VPN. Při změně kteréhokoli z těchto rozhraní systém vytvoří objekt Network a předá ho příslušné metodě registrovaného callback. Každý Network má jedinečný identifikátor, který se mění při opětovném připojení.
Callback není vázán na konkrétní typ sítě — může sledovat všechna dostupná rozhraní současně. Pro filtrování typů připojení se používá třída NetworkRequest, kde jsou specifikovány požadované transportní protokoly (Wi-Fi, mobilní data, Ethernet) a možnosti sítě.
Registrace NetworkCallback se provádí metodou ConnectivityManager.registerNetworkCallback. Prvním parametrem je NetworkRequest.Builder popisující požadavky na síť, druhým — instance callback. Pro fungování je vyžadováno oprávnění ACCESS_NETWORK_STATE v manifestu.
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", "Dostupné: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Ztraceno: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
Doporučuje se registrovat NetworkCallback v okamžiku, kdy je aplikace v popředí, a zrušit při přechodu do pozadí. V Activity je vhodné použít onStart a onStop pro správu životního cyklu callback. Ve Fragmentu — onResume a onPause.
Pro zjednodušení správy registrace lze použít Lifecycle-aware komponenty. Knihovna AndroidX Lifecycle umožňuje vytvořit vlastní LifecycleObserver, který automaticky registruje a ruší callback při změně stavu životního cyklu.
Pro úlohy na pozadí se registrace provádí v Service nebo WorkManager. Je důležité vzít v úvahu, že v Android 8+ mají služby na pozadí omezení spouštění. WorkManager s NetworkType — spolehlivější způsob provádění úloh při určitém stavu sítě, protože je integrován s API kompatibility a zohledňuje režim Doze.
NetworkCallback poskytuje sadu metod, které se volají při změně stavu sítě. Není nutné přepisovat všechny metody — stačí implementovat pouze ty, které jsou potřebné pro konkrétní úlohu aplikace. onAvailable a onLost jsou minimálně vyžadovány pro základní monitorování připojení.
| Metoda | Kdy se volá | Parametry |
|---|---|---|
| onAvailable | Síť je k dispozici k použití | Network — objekt sítě |
| onLost | Síť je ztracena nebo odpojena | Network — objekt sítě |
| onCapabilitiesChanged | Změnily se možnosti sítě | Network, NetworkCapabilities |
| onBlockedStatusChanged | Změnil se stav blokování | Network, Boolean |
| onNetworkSuspended | Síť je pozastavena systémem | Network |
| onNetworkResumed | Síť je obnovena po pozastavení | Network |
Tato metoda je klíčová pro získání podrobných informací o síti. Parametr NetworkCapabilities obsahuje příznaky: NET_CAPABILITY_INTERNET — přístup k internetu, NET_CAPABILITY_NOT_METERED — neomezené připojení, NET_CAPABILITY_NOT_ROAMING — bez roamingu. Lze také zjistit zpoždění signálu a šířku pásma.
Captive portály — zvláštní případ: při připojení k veřejné síti Wi-Fi přes portál metoda onCapabilitiesChanged nezobrazí okamžitě INTERNET. Nejprve je síť dostupná, ale bez internetu — je vyžadována autorizace přes prohlížeč. Vývojář musí toto zpoždění zohlednit v logice aplikace.
Volá se, když systém blokuje síťový provoz pro aplikaci — například při zapnutí režimu úspory dat nebo omezení dat na pozadí. onBlockedStatusChanged umožňuje aplikaci zjistit, že její síťové požadavky jsou dočasně zakázány, a přepnout se na místní zpracování.
Podívejme se na praktickou implementaci NetworkCallback pro sledování přístupu k internetu a zpracování captive portálů. V příkladu níže je ukázána kontrola NET_CAPABILITY_INTERNET a validace připojení pomocí HTTP požadavku na server 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", "Mobilní data připojena")
hasInternet ->
Log.d("Network", "Wi-Fi připojeno")
else ->
Log.d("Network", "Bez přístupu k internetu")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Připojení ztraceno: ${network}")
// Zastavit síťové požadavky
}
}
Při připojení k veřejné síti s autorizací (kavárna, letiště) systém nejprve hlásí onAvailable, ale onCapabilitiesChanged nemusí zobrazit INTERNET. V takových případech je vyžadována dodatečná kontrola pomocí HTTP požadavku na stabilní endpoint, například https://www.google.com/generate_204.
Pokud požadavek vrátí kód 204 — internet je dostupný. Pokud přesměrování (301, 302, 307) — je vyžadována autorizace přes prohlížeč. V tomto případě lze otevřít WebView nebo Intent na URL přesměrování pro autentizaci na portálu.
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 je dostupný")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portál detekován")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Validace selhala: ${e.message}")
}
}
}
Před NetworkCallback byl hlavním způsobem monitorování sítě BroadcastReceiver s filtrem android.net.conn.CONNECTIVITY_CHANGE. Tento přístup měl značné nevýhody: zpoždění několika sekund, absence informací o typu rozhraní, zvýšená spotřeba energie kvůli neustálému probouzení zařízení.
Moderní alternativa — LiveData nebo StateFlow ve spojení s NetworkCallback. Vzor spočívá v zabalení callback do reaktivního proudu, který automaticky informuje UI o změně stavu. Například MutableStateFlow s typem NetworkStatus je aktualizován uvnitř metod callback a ViewCollector se přihlásí ke změnám.
| Metoda | API Level | Zpoždění | Detailnost | Spotřeba energie |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | vysoké | nízká | vysoká |
| NetworkCallback | 21+ | nízké | vysoká | nízká |
| ConnectivityManager.getActiveNetwork | 23+ | okamžité | střední | nulová |
| NWPathMonitor (iOS) | iOS 12+ | nízké | vysoká | nízká |
Od Androidu 10 je úroveň omezení na pozadí zpřísněna a NetworkCallback nemusí být volán, když je aplikace na pozadí. Pro kriticky důležité úlohy — například načítání dat při objevení sítě — použijte WorkManager s omezením NetworkType.CONNECTED. WorkManager garantuje provedení úlohy při splnění podmínek sítě.
V Androidu 12+ se objevilo omezení pro registraci v manifestu BroadcastReceiver pro CONNECTIVITY_ACTION. Vývojáři jsou povinni migrovat na NetworkCallback nebo použít WorkManager. Politika Google Play od srpna 2022 vyžaduje odstranění registrace v manifestu pro tuto akci.
Často kladené otázky
BroadcastReceiver s CONNECTIVITY_CHANGE poskytuje pouze fakt změny sítě bez podrobností a se zpožděním až několik sekund. NetworkCallback pracuje asynchronně, poskytuje objekt Network, typ rozhraní, možnosti připojení a nevyžaduje registraci v manifestu, která je zakázána v Android 12+.
V Android 10+ mohou omezení na pozadí zpozdit nebo nevolat NetworkCallback. Pro úlohy na pozadí použijte WorkManager s omezením NetworkType — zaručuje provedení práce při splnění podmínek bez ohledu na režim úspory energie.
Zavolejte metodu unregisterNetworkCallback na ConnectivityManager a předejte stejnou instanci callback, která byla použita při registraci. Nezrušený callback může způsobit únik paměti, protože systém uchovává referenci na něj. Vždy rušte v onStop nebo onDestroy.
NetworkCallback je dostupný od API Level 21 (Android 5.0 Lollipop). Pro zařízení se staršími verzemi použijte BroadcastReceiver nebo knihovny kompatibility jako AndroidX Activity NetworkCallback, které obalují API pro širší podporu.
Použijte ConnectivityManager.getActiveNetwork (API 23+) spolu s getNetworkCapabilities. Metoda vrací aktuální aktivní síť synchronně, bez přihlášení ke změnám. Pro API 21-22 použijte getActiveNetworkInfo, který je označen jako deprecated v novějších verzích.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také