NetworkCallback: co to je, aplikace a zpracování sítě v Androidu

Autor: IT Sectr Publikováno: 2026-03-10 Doba čtení: 9 min

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 — vestavěná abstraktní třída Android SDK pro sledování stavu sítě přes ConnectivityManager.
  • Metoda onAvailable se volá při připojení zařízení k síti a předává objekt Network s detaily spojení.
  • Metoda onLost se spouští při ztrátě síťového připojení a umožňuje aplikaci zastavit síťové požadavky.
  • Metoda onCapabilitiesChanged informuje o změně možností sítě — objevení internetu, captive portálu nebo placeného připojení.
  • Registrace se provádí přes registerNetworkCallback, zrušení — přes unregisterNetworkCallback v životním cyklu aplikace.

Co je NetworkCallback?

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.

Jak callback funguje v Androidu

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ě.

Jak zaregistrovat NetworkCallback v aplikaci

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.

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", "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)
    }
}

Registrace v Activity a Fragmentu

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.

Registrace ve službě

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.

Hlavní metody NetworkCallback

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í.

MetodaKdy se voláParametry
onAvailableSíť je k dispozici k použitíNetwork — objekt sítě
onLostSíť je ztracena nebo odpojenaNetwork — objekt sítě
onCapabilitiesChangedZměnily se možnosti sítěNetwork, NetworkCapabilities
onBlockedStatusChangedZměnil se stav blokováníNetwork, Boolean
onNetworkSuspendedSíť je pozastavena systémemNetwork
onNetworkResumedSíť je obnovena po pozastaveníNetwork

Metoda onCapabilitiesChanged

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.

Metoda onBlockedStatusChanged

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í.

Příklady implementace NetworkCallback

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.

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", "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
    }
}

Zpracování captive portálů

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.

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

Rozdíly od jiných způsobů monitorování sítě

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.

MetodaAPI LevelZpožděníDetailnostSpotřeba energie
BroadcastReceiver1+vysokénízkávysoká
NetworkCallback21+nízkévysokánízká
ConnectivityManager.getActiveNetwork23+okamžitéstřednínulová
NWPathMonitor (iOS)iOS 12+nízkévysokánízká

Práce s režimem na pozadí

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

Jaký je rozdíl mezi NetworkCallback a BroadcastReceiver pro síť?

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+.

Lze použít NetworkCallback v režimu na pozadí?

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.

Jak zrušit registraci NetworkCallback?

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.

Jaká verze Androidu je minimálně vyžadována pro NetworkCallback?

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.

Jak zkontrolovat aktuální stav sítě bez callback?

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í

  • NetworkCallback — abstraktní třída Android SDK pro asynchronní monitorování sítě přes ConnectivityManager bez neustálého dotazování.
  • Metoda onAvailable informuje o připojení k síti, onLost — o ztrátě připojení, onCapabilitiesChanged — o změně možností sítě.
  • Registrace se provádí přes registerNetworkCallback s uvedením NetworkRequest a instance callback.
  • Životní cyklus vyžaduje zrušení registrace v onStop pro Activity a onPause pro Fragment.
  • Captive portály jsou zpracovávány pomocí dodatečného HTTP požadavku na generate_204 pro kontrolu skutečného přístupu k internetu.
  • NetworkCallback nahradil BroadcastReceiver pro CONNECTIVITY_ACTION, který je zakázán v manifestu na Android 12+.
  • Pro úlohy na pozadí použijte WorkManager s NetworkType.CONNECTED místo přímé registrace NetworkCallback.

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í.

Prodiskutovat projekt

Přečtěte si také