Connectivity Manager — je systémová služba Androidu, která poskytuje aplikacÃm informace o stavu sÃÅ¥ového pÅ™ipojenà zaÅ™ÃzenÃ. Umožňuje kontrolovat pÅ™Ãtomnost internetu, urÄovat typ sÃtÄ› (Wi-Fi, mobilnà data, Ethernet), sledovat zmÄ›ny v pÅ™ipojenà a Å™Ãdit sÃÅ¥ové požadavky v závislosti na kvalitÄ› komunikace. Podle Android Developers, 2025 je ConnectivityManager hlavnÃm API pro monitorovánà sÃtÄ› a je souÄástà Android Framework od API Level 1.
Hlavnà body
ConnectivityManager — je systémová služba operaÄnÃho systému Android, dostupná prostÅ™ednictvÃm Context.getSystemService(Context.CONNECTIVITY_SERVICE). Poskytuje API pro zÃskávánà informacà o sÃÅ¥ovém pÅ™ipojenà zaÅ™ÃzenÃ, monitorovánà zmÄ›n sÃtÄ› a Å™Ãzenà sÃÅ¥ových požadavků aplikace. Connectivity Manager je souÄástà Android Framework od prvnà verze platformy (API Level 1) a bÄ›hem desetiletà proÅ¡el významnými zmÄ›nami: od jednoduchého getActiveNetworkInfo() až po modernà reaktivnà model s NetworkCallback a NetworkRequest.
Hlavnà možnosti Connectivity Manager zahrnujÃ: kontrolu pÅ™Ãtomnosti aktivnÃho sÃÅ¥ového pÅ™ipojenÃ, urÄovánà typu sÃtÄ› (Wi-Fi, mobilnà data, Ethernet, Bluetooth, VPN), sledovánà zmÄ›n stavu sÃtÄ› v reálném Äase, zÃskávánà informacà o Å¡ÃÅ™ce pásma a zpoždÄ›nÃ, Å™Ãzenà sÃÅ¥ových požadavků aplikace. ConnectivityManager je použÃván spoleÄnÄ› s WorkManager a Repository pro implementaci Offline-First architektury, adaptivnÃho naÄÃtánà obsahu a optimalizace práce aplikace v závislosti na kvalitÄ› pÅ™ipojenÃ.
Od Androidu 10 (API 29) Google zmÄ›nil pÅ™Ãstup k práci s ConnectivityManager. Metoda getActiveNetworkInfo() byla prohlášena za deprecated a mÃsto nà se doporuÄuje použÃvat registerDefaultNetworkCallback() nebo registerNetworkCallback() s NetworkRequest. Nové API poskytuje podrobnÄ›jšà informace o sÃti, vÄetnÄ› možnosti detekce captive portálů (Wi-Fi s autentizacÃ) a hodnocenà kvality pÅ™ipojenÃ. ConnectivityManager je také integrován s rodinou Jetpack: knihovna ConnectivityManager byla vydána v roce 2024 jako souÄást Jetpack pro zjednoduÅ¡enà monitorovánà sÃtÄ› v aplikacÃch Compose.
V modernà Android architektuÅ™e je ConnectivityManager použÃván na úrovni repository nebo UseCase pro rozhodovánà o sÃÅ¥ových požadavcÃch. Vrstva Repository kontroluje stav sÃtÄ› pÅ™ed volánÃm API: pokud je sÃÅ¥ nedostupná, vracejà se data z mÃstnÃho úložiÅ¡tÄ› (Room). Pokud je sÃÅ¥ dostupná, provede se požadavek na server a výsledek se uložà do Room. ViewModel se pÅ™ihlásà k odbÄ›ru Flow z Room a nezná detaily sÃÅ¥ové interakce — to umožňuje snadné testovánà každé vrstvy nezávisle.
Connectivity Manager zÃskává informace o stavu sÃtÄ› od systémové služby connectivity, která komunikuje se sÃÅ¥ovými rozhranÃmi jádra Linux. Když se zaÅ™Ãzenà pÅ™ipojà k Wi-Fi nebo zapne mobilnà data, jádro informuje systémovou službu, která aktualizuje vnitÅ™nà stav a informuje vÅ¡echny registrované callbacky. Architektura ConnectivityManager je postavena na vzoru Observer: aplikace registruje NetworkCallback a dostává upozornÄ›nà na jakékoli zmÄ›ny sÃtÄ› — vznik pÅ™ipojenÃ, jeho ztrátu, zmÄ›nu typu sÃtÄ› nebo zhorÅ¡enà kvality.
Modernà API ConnectivityManager použÃvá NetworkRequest k filtrovánà sÃÅ¥ových událostÃ. NetworkRequest umožňuje specifikovat požadavky na sÃÅ¥: transport (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET), možnost pÅ™Ãstupu k internetu (NetworkCapabilities.NET_CAPABILITY_INTERNET) a dalšà kritéria. Pokud aplikace potÅ™ebuje pouze Wi-Fi pro stahovánà velkých souborů, vytvořà NetworkRequest s Transport.WIFI a zaregistruje callback. Systém bude aplikaci informovat pouze pÅ™i zmÄ›nÄ› Wi-Fi pÅ™ipojenÃ, ignoruje události mobilnà sÃtÄ›.
Důležitou vlastnostà Connectivity Manager na Android 12+ je capabilities-based networking. Aplikace nejen kontroluje, zda je internet, ale může vyhodnotit, jaký typ provozu je k dispozici. NapÅ™Ãklad NET_CAPABILITY_NOT_METERED oznaÄuje neomezené pÅ™ipojenà (Wi-Fi), NET_CAPABILITY_NOT_ROAMING — že zaÅ™Ãzenà nenà v roamingu. To umožňuje rozhodovánÃ: naÄÃtat video pouze pÅ™es Wi-Fi, odložit synchronizaci v roamingu nebo použÃvat mobilnà data pouze pro kritické požadavky.
| API Level | DoporuÄená metoda | Stav |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | Deprecated |
| 21+ | NetworkCallback + registerNetworkCallback() | DoporuÄeno |
| 24+ | registerDefaultNetworkCallback() | DoporuÄeno |
| 28+ | getActiveNetwork() + NetworkCapabilities | Alternativa |
| 31+ | registerBestMatchingNetworkCallback() | Nové API |
Pro použità Connectivity Manager v aplikaci Android jsou vyžadována oprávnÄ›nÃ. ACCESS_NETWORK_STATE — povinné oprávnÄ›nà pro Ätenà informacà o sÃti, deklarované v AndroidManifest.xml. Bez tohoto oprávnÄ›nà ConnectivityManager vrátà null pro getActiveNetwork() a nebude volat callbacky. Pro provádÄ›nà sÃÅ¥ových operacà je také vyžadováno oprávnÄ›nà INTERNET. Od Android 10 (API 29) může aplikace kontrolovat stav sÃtÄ› bez dalÅ¡Ãch runtime oprávnÄ›nà — ACCESS_NETWORK_STATE je běžné oprávnÄ›nà (normal permission) a je udÄ›leno automaticky pÅ™i instalaci.
Modernà Connectivity Manager poskytuje nÄ›kolik klÃÄových metod pro práci se sÃtÃ. getActiveNetwork() (API 23+) vracà objekt Network aktuálnà aktivnà sÃtÄ› nebo null, pokud zaÅ™Ãzenà nenà pÅ™ipojeno. Tato metoda nevyžaduje callbacky a je vhodná pro jednorázovou kontrolu. Objekt Network lze pÅ™edat do NetworkCapabilities pro zÃskánà podrobných informacÃ: typ transportu, metered stav, roaming, možnost pÅ™Ãstupu k internetu a dalšà charakteristiky.
registerDefaultNetworkCallback() (API 24+) — preferovaný způsob monitorovánà sÃtÄ›. Aplikace zaregistruje callback, který je volán pÅ™i jakýchkoli zmÄ›nách výchozà sÃtÄ› (sÃtÄ›, pÅ™es kterou aplikace odesÃlá provoz). Callback obdržà objekt Network, který lze použÃt pro pÅ™ipojenà socketů a HTTP klientů. Tato metoda nahrazuje zastaralý getActiveNetworkInfo() a zajišťuje reaktivnà monitorovánà sÃtÄ› bez pollingu.
registerNetworkCallback() (API 21+) umožňuje pÅ™ihlásit se k odbÄ›ru zmÄ›n urÄitého typu sÃtÄ› prostÅ™ednictvÃm NetworkRequest. NapÅ™Ãklad aplikace může sledovat pouze Wi-Fi sÃtÄ› pÅ™es new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(). Systém bude aplikaci informovat o pÅ™ipojenÃ/odpojenà od Wi-Fi, aniž by ovlivnil události mobilnà sÃtÄ›. NetworkCapabilities.getLinkDownstreamBandwidthKbps() vracà odhad Å¡ÃÅ™ky pásma downstream kanálu v kbps, což umožňuje pÅ™izpůsobit kvalitu obsahu rychlosti pÅ™ipojenÃ.
| Metoda | Minimálnà API | ÚÄel |
|---|---|---|
| getActiveNetwork() | 23 | ZÃskánà aktuálnà aktivnà sÃtÄ› |
| getNetworkCapabilities() | 21 | ZÃskánà možnostà sÃtÄ› (typ, metered, roaming) |
| registerDefaultNetworkCallback() | 24 | Monitorovánà výchozà sÃtÄ› |
| registerNetworkCallback() | 21 | Monitorovánà sÃtà podle filtru NetworkRequest |
| unregisterNetworkCallback() | 21 | Zrušenà registrace callbacku |
| getActiveNetworkInfo() | 1 | Zastaralé (deprecated), nepoužÃvat |
Knihovna Jetpack Connectivity (androidx.core:core-ktx) poskytuje pohodlná rozÅ¡ÃÅ™enà pro práci s ConnectivityManager v Compose. Funkce ConnectivityManager.observeAsState() vracà State<Boolean>, který se aktualizuje pÅ™i zmÄ›nÄ› sÃtÄ›. Komponenta @Composable NetworkStatus() zobrazuje stav pÅ™ipojenà a automaticky se pÅ™ekresluje pÅ™i zmÄ›nách. To zbavuje vývojáře ruÄnà správy callbacků a životnÃho cyklu Activity/Fragment.
ConnectivityManager.NetworkCallback — je abstraktnà tÅ™Ãda s metodami, které systém volá pÅ™i zmÄ›nÄ› stavu sÃtÄ›. onAvailable(Network) — je volána, když se sÃÅ¥ stane dostupnou. Aplikace obdržà objekt Network, který lze použÃt pro pÅ™ipojenà socketů prostÅ™ednictvÃm Network.bindSocket(). onLost(Network) — je volána, když se sÃÅ¥ stane nedostupnou. Aplikace by mÄ›la pÅ™epnout na mÃstnà data nebo zobrazit zprávu o chybÄ›jÃcÃm pÅ™ipojenÃ. onCapabilitiesChanged(Network, NetworkCapabilities) — je volána pÅ™i zmÄ›nÄ› charakteristik sÃtÄ› (napÅ™Ãklad pÅ™i pÅ™epÃnánà z Wi-Fi na mobilnà data).
Správné zpracovánà zmÄ›n sÃtÄ› vyžaduje zohlednÄ›nà životnÃho cyklu komponenty. Callback by mÄ›l být zaregistrován v onStart()/onResume() a zruÅ¡en v onStop()/onPause(). Pokud callback nenà zruÅ¡en, může být volán po zniÄenà Activity, což vede k úniku pamÄ›ti. V architektuÅ™e Jetpack ViewModel se doporuÄuje použÃvat lifecycleScope pro registraci callbacku, aby byl automaticky zruÅ¡en pÅ™i ÄiÅ¡tÄ›nà ViewModel. Pro služby a úlohy na pozadà se použÃvá WorkManager s omezenÃm NetworkType.
Zpracovánà captive portálů — důležitá vlastnost ConnectivityManager od Android 10. CAPTIVE_PORTAL — scénář, kdy je Wi-Fi sÃÅ¥ dostupná, ale vyžaduje autentizaci prostÅ™ednictvÃm webové stránky (letiÅ¡tÄ›, hotely, kavárny). NetworkCapabilities.NET_CAPABILITY_VALIDATED indikuje, že sÃÅ¥ má plný pÅ™Ãstup k internetu. Pokud NET_CAPABILITY_VALIDATED chybÃ, aplikace může otevÅ™Ãt prohlÞeÄ pro autentizaci prostÅ™ednictvÃm captive portálu. Pro detekci captive portálu se použÃvá metoda isCaptivePortal(), pÅ™idaná v Android 11 (API 30).
ConnectivityManager umožňuje požádat sÃÅ¥ pro konkrétnà úÄely prostÅ™ednictvÃm requestNetwork() a bindProcessToNetwork(). NapÅ™Ãklad aplikace pro stahovánà velkých souborů může požadovat Wi-Fi sÃÅ¥, i když je aktivnà mobilnÃ. K tomu se vytvořà NetworkRequest s addTransportType(TRANSPORT_WIFI) a když se Wi-Fi objevÃ, systém zavolá onAvailable(). Aplikace pÅ™ipojà sockety k této sÃti prostÅ™ednictvÃm network.bindSocket() nebo OkHttp s nakonfigurovaným Network objektem. To poskytuje flexibilnà kontrolu nad použÃvánÃm sÃÅ¥ových rozhranÃ.
PodÃvejme se na úplný pÅ™Ãklad použità ConnectivityManager s modernÃm API (NetworkCallback) v architektuÅ™e Clean Architecture. NetworkMonitor — tÅ™Ãda obalujÃcà ConnectivityManager, která poskytuje reaktivnà stav sÃtÄ› prostÅ™ednictvÃm StateFlow. ViewModel se pÅ™ihlásà k odbÄ›ru tohoto Flow a pÅ™edává stav do UI. Repository použÃvá NetworkMonitor pro rozhodovánà o sÃÅ¥ových požadavcÃch. Tento pÅ™Ãstup zajišťuje testovatelnost a izolaci platforemových závislostÃ.
NásledujÃcà pÅ™Ãklad ukazuje, jak správnÄ› použÃvat ConnectivityManager s registerDefaultNetworkCallback. TÅ™Ãda NetworkMonitor zapouzdÅ™uje práci se systémovou službou a poskytuje Äistý Kotlin Flow<Boolean>. Registruje callback pÅ™i startu a rušà jej pÅ™i ukonÄenà životnÃho cyklu. Asynchronnà práce je zajiÅ¡tÄ›na prostÅ™ednictvÃm korutin a callbackFlow — mostu mezi callback stylem ConnectivityManager a reaktivnÃm Flow stylem Kotlin.
class NetworkMonitor(
private val connectivityManager: ConnectivityManager
) {
val isOnline: StateFlow<Boolean> = callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(true)
}
override fun onLost(network: Network) {
trySend(false)
}
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val connected = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
trySend(connected)
}
}
connectivityManager.registerDefaultNetworkCallback(callback)
awaitClose {
connectivityManager.unregisterNetworkCallback(callback)
}
}.stateIn(
CoroutineScope(Dispatchers.Default),
SharingStarted.WhileSubscribed(5000),
initialValue = checkInitialState()
)
private fun checkInitialState(): Boolean {
val network = connectivityManager.getActiveNetwork() ?: return false
val caps = connectivityManager.getNetworkCapabilities(network) ?: return false
return caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
}
}
ViewModel se pÅ™ihlásà k odbÄ›ru NetworkMonitor.isOnline prostÅ™ednictvÃm stateIn() a pÅ™edává stav do Compose. Repository kontroluje aktuálnà hodnotu isOnline.value pÅ™ed volánÃm API: pokud je false — vracà Flow z Room. Pokud je true — volá API, ukládá výsledek do Room a vracà Flow z Room. WorkManager použÃvá NetworkType.CONNECTED pro omezenà úloh na pozadÃ. Testovánà NetworkMonitor se provádà s mock objektem ConnectivityManager a fake NetworkCallback, což umožňuje emulovat libovolné scénáře sÃtÄ› v jednotkových testech.
Prvnà pravidlo práce s ConnectivityManager — nepoužÃvat zastaralé API. getActiveNetworkInfo() je deprecated od API 29 a může vracet nesprávná data na nových verzÃch Androidu. MÃsto nÄ›j použijte getActiveNetwork() + getNetworkCapabilities() pro jednorázovou kontrolu a registerDefaultNetworkCallback() pro průběžné monitorovánÃ. Stará metoda nerozliÅ¡uje sÃtÄ› s captive portálem od úplného internetu, což vede k faleÅ¡ným výsledkům.
Druhé pravidlo — vždy zruÅ¡it registraci callbacku. Pokud Activity zaregistruje NetworkCallback v onStart(), ale nezrušà v onStop(), callback pokraÄuje v práci po zniÄenà Activity. To způsobuje únik pamÄ›ti a potenciálnà NullPointerException, když callback zkusà aktualizovat UI zniÄené komponenty. Použijte lifecycleScope nebo repeatOnLifecycle pro automatickou správu registrace. V Jetpack Compose použijte DisposableEffect pro registraci a zruÅ¡enà callbacku.
TÅ™età Äastá chyba — kontrola pouze existence sÃtÄ› bez ohledu na jejà kvalitu. Pouhé "existuje internet" nestaÄà k rozhodovánÃ. Aplikace by mÄ›la kontrolovat NET_CAPABILITY_NOT_METERED pro stahovánà velkých souborů, NET_CAPABILITY_NOT_ROAMING pro synchronizaci na pozadÃ, NET_CAPABILITY_VALIDATED pro potvrzenà pÅ™Ãstupu k internetu. Ignorovánà tÄ›chto pÅ™Ãznaků vede k tomu, že se aplikace pokoušà naÄÃtat video v roamingu nebo synchronizovat data prostÅ™ednictvÃm captive portálu hotelu.
Ätvrté — nepoužÃvat ConnectivityManager pro kontrolu dostupnosti konkrétnÃho serveru. ConnectivityManager hlásà stav sÃtÄ› na zaÅ™ÃzenÃ, ale nezaruÄuje, že je server dostupný. Pro kontrolu dostupnosti API použijte HTTP požadavek s krátkým timeoutem nebo Health Check. ConnectivityManager + HTTP ping je spolehlivá kombinace: nejprve se zkontroluje pÅ™Ãtomnost sÃtÄ›, poté se provede lehký požadavek na server pro potvrzenà skuteÄné dostupnosti.
Pro jednotkové testy použijte Robolectric s ShadowConnectivityManager, který umožňuje emulovat stav sÃtÄ›. Pro integraÄnà testy — Android Test Orchestrator s pÅ™epÃnánÃm Režimu letadlo. V testech kontrolujte scénáře: pÅ™echod z online do offline, výskyt Wi-Fi pÅ™i aktivnà mobilnà sÃti, ztráta sÃtÄ› bÄ›hem provádÄ›nà požadavku, captive portál, roaming. Pro mockovánà v modulárnÃch testech použijte rozhranà wrapperu (napÅ™. NetworkMonitorInterface), které lze nahradit mock objektem bez platforemových závislostÃ.
Äasto kladené otázky
Modernà způsob — použijte registerDefaultNetworkCallback() s kontrolou NET_CAPABILITY_INTERNET v onCapabilitiesChanged(). Pro jednorázovou kontrolu: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. Zastaralá metoda getActiveNetworkInfo() se nedoporuÄuje od API 29+.
Pro Ätenà informacà o sÃti je vyžadováno oprávnÄ›nà android.permission.ACCESS_NETWORK_STATE. Jedná se o běžné oprávnÄ›nà (normal permission) — je udÄ›leno automaticky pÅ™i instalaci aplikace a nevyžaduje runtime žádost. Pro provádÄ›nà sÃÅ¥ových operacà (HTTP požadavky) je také vyžadováno oprávnÄ›nà INTERNET.
registerDefaultNetworkCallback() sleduje výchozà sÃÅ¥ — tu, pÅ™es kterou aplikace odesÃlá hlavnà provoz. registerNetworkCallback(NetworkRequest) sleduje sÃtÄ› odpovÃdajÃcà zadanému filtru (napÅ™. pouze Wi-Fi). Výchozà callback je jednoduššà a pokrývá 90% scénářů, vlastnà request je pro specifické požadavky na typ sÃtÄ›.
Použijte NetworkCapabilities: caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) pro Wi-Fi, hasTransport(TRANSPORT_CELLULAR) pro mobilnà data. NepoužÃvejte ConnectivityManager.getActiveNetworkInfo().getType() — tato metoda je deprecated. NetworkCapabilities je dostupný prostÅ™ednictvÃm connectivityManager.getNetworkCapabilities(network).
getActiveNetworkInfo() je zastaralý kvůli nepÅ™esnosti: nerozliÅ¡uje sÃtÄ› s captive portálem od úplného internetu, neposkytuje informace o Å¡ÃÅ™ce pásma a roamingu. Od Androidu 10 tato metoda může vrátit null nebo nesprávná data pro vÃcekanálová pÅ™ipojenà (multi-network). Náhrada — getActiveNetwork() + NetworkCapabilities.
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é