NetworkCallback — egy absztrakt osztály az Android SDK-ban a hálózati állapotváltozások monitorozására a ConnectivityManager-en keresztül. A Android Developers Documentation (2025) szerint a NetworkCallback használata lehetővé teszi az alkalmazás számára, hogy időben reagáljon a csatlakozásra, leválásra vagy a kapcsolat jellemzőinek megváltozására. ConnectivityManager.NetworkCallback részletes információkat nyújt a hálózat típusáról, a captive portálokról és az internet elvesztéséről a rendszerszolgáltatás folyamatos lekérdezése nélkül.
Főbb pontok
NetworkCallback — egy absztrakt osztály az android.net csomagból, amely az Android SDK részét képezi. Arra szolgál, hogy értesítéseket kapjon a hálózati kapcsolat állapotának változásairól a ConnectivityManager rendszerszolgáltatáson keresztül.
A NetworkCallback megjelenése előtt a fejlesztők BroadcastReceiver műsorszóró vevőket használtak a hálózat követésére. Ez a megközelítés állandó regisztrációt igényelt a manifestben, késleltetéssel működött, és nem adott részletes információt a kapcsolat jellemzőiről. Android 5.0 (API 21) bevezette a NetworkCallback-et, mint rugalmasabb és hatékonyabb alternatívát.
A callback aszinkron módon működik: az alkalmazás feliratkozik az eseményekre a ConnectivityManager-en keresztül, és a rendszer meghívja a callback metódusait a hálózati állapot változásakor. Ez kiküszöböli a hálózati állapot időszakos lekérdezésének (polling) szükségességét, így kímélve az akkumulátor és a processzor erőforrásait.
A ConnectivityManager kezeli az eszköz összes hálózati interfészét — Wi-Fi, mobil adatok, Ethernet, VPN. Bármelyik interfész megváltozásakor a rendszer létrehoz egy Network objektumot, és továbbítja a regisztrált callback megfelelő metódusához. Minden Network egyedi azonosítóval rendelkezik, amely újracsatlakozáskor megváltozik.
A callback nincs egy adott hálózati típushoz kötve — egyszerre képes követni az összes elérhető interfészt. A kapcsolattípusok szűréséhez a NetworkRequest osztályt használják, ahol megadják a szükséges szállítási protokollokat (Wi-Fi, mobil adatok, Ethernet) és a hálózati képességeket.
A NetworkCallback regisztrációja a ConnectivityManager.registerNetworkCallback metóduson keresztül történik. Az első paraméter a NetworkRequest.Builder, amely leírja a hálózatra vonatkozó követelményeket, a második — a callback egy példánya. A működéshez ACCESS_NETWORK_STATE engedély szükséges a manifestben.
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", "Elérhető: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Elveszett: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
Ajánlott a NetworkCallback regisztrálása akkor, amikor az alkalmazás az előtérben van, és törlése a háttérbe kerüléskor. Activity-ben kényelmes az onStart és onStop használata a callback életciklusának kezelésére. Fragment-ben — onResume és onPause.
A regisztráció kezelésének egyszerűsítéséhez Lifecycle-aware komponensek használhatók. Az AndroidX Lifecycle könyvtár lehetővé teszi egy egyéni LifecycleObserver létrehozását, amely automatikusan regisztrálja és törli a callback-et az életciklus állapotának változásakor.
Háttérfeladatokhoz a regisztráció Service-ben vagy WorkManager-ben történik. Fontos figyelembe venni, hogy Android 8+ ban a háttérszolgáltatások indítási korlátozásokkal rendelkeznek. WorkManager NetworkType-val — megbízhatóbb mód a feladatok végrehajtására adott hálózati állapot mellett, mivel integrálva van a kompatibilitási API-val, és figyelembe veszi a Doze módot.
A NetworkCallback metóduskészletet biztosít, amelyek a hálózati állapot változásakor hívódnak meg. Nem kötelező az összes metódust felülírni — elegendő csak azokat implementálni, amelyek az alkalmazás adott feladatához szükségesek. Az onAvailable és onLost minimálisan szükségesek az alapvető kapcsolatfigyeléshez.
| Metódus | Mikor hívódik meg | Paraméterek |
|---|---|---|
| onAvailable | A hálózat elérhető használatra | Network — hálózati objektum |
| onLost | A hálózat elveszett vagy lekapcsolódott | Network — hálózati objektum |
| onCapabilitiesChanged | A hálózati képességek megváltoztak | Network, NetworkCapabilities |
| onBlockedStatusChanged | A blokkolási állapot megváltozott | Network, Boolean |
| onNetworkSuspended | A hálózatot a rendszer felfüggesztette | Network |
| onNetworkResumed | A hálózat a felfüggesztés után folytatódott | Network |
Ez a metódus kulcsfontosságú a részletes hálózati információk megszerzéséhez. A NetworkCapabilities paraméter jelzőket tartalmaz: NET_CAPABILITY_INTERNET — internet hozzáférés, NET_CAPABILITY_NOT_METERED — korlátlan kapcsolat, NET_CAPABILITY_NOT_ROAMING — nincs roaming. Továbbá megtudható a jel késleltetése és a sávszélesség.
A captive portálok (captive portals) — külön eset: nyilvános Wi-Fi hálózathoz portálon keresztül csatlakozva az onCapabilitiesChanged metódus nem mutat azonnal INTERNET-et. Először a hálózat elérhető, de internet nélkül — böngészőn keresztüli hitelesítés szükséges. A fejlesztőnek figyelembe kell vennie ezt a késleltetést az alkalmazás logikájában.
Akkor hívódik meg, amikor a rendszer blokkolja a hálózati forgalmat az alkalmazás számára — például adattakarékos mód bekapcsolásakor vagy a háttéradatok korlátozásakor. onBlockedStatusChanged lehetővé teszi az alkalmazás számára, hogy megtudja, hálózati kérései ideiglenesen tiltva vannak, és átváltson helyi feldolgozásra.
Tekintsük át a NetworkCallback gyakorlati megvalósítását az internet-hozzáférés követésére és a captive portálok kezelésére. Az alábbi példában a NET_CAPABILITY_INTERNET ellenőrzése és a kapcsolat érvényesítése HTTP kéréssel a Google szerverhez látható.
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", "Mobil adat csatlakoztatva")
hasInternet ->
Log.d("Network", "Wi-Fi csatlakoztatva")
else ->
Log.d("Network", "Nincs internet hozzáférés")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Kapcsolat elveszett: ${network}")
// Hálózati kérések leállítása
}
}
Amikor hitelesítést igénylő nyilvános hálózathoz csatlakozik (kávézó, repülőtér), a rendszer először onAvailable-t jelez, de az onCapabilitiesChanged nem biztos, hogy mutat INTERNET-et. Ilyen esetekben további ellenőrzés szükséges HTTP kéréssel egy stabil végponthoz, például https://www.google.com/generate_204.
Ha a kérés 204-es kódot ad vissza — van internet. Ha átirányítás (301, 302, 307) — böngészőn keresztüli hitelesítés szükséges. Ebben az esetben megnyitható WebView vagy Intent az átirányítási URL-re a portálon történő hitelesítéshez.
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", "Az internet elérhető")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal észlelve")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Érvényesítés sikertelen: ${e.message}")
}
}
}
A NetworkCallback előtt a hálózatfigyelés fő módszere a BroadcastReceiver volt az android.net.conn.CONNECTIVITY_CHANGE szűrővel. Ennek a megközelítésnek jelentős hátrányai voltak: több másodperces késleltetés, hiányzó információ az interfész típusáról, megnövekedett energiafogyasztás az eszköz folyamatos ébresztése miatt.
Modern alternatíva — LiveData vagy StateFlow a NetworkCallback-kel párosítva. A minta abból áll, hogy a callback-et reaktív adatfolyamba csomagolják, amely automatikusan értesíti a UI-t az állapotváltozásról. Például a NetworkStatus típusú MutableStateFlow frissül a callback metódusain belül, a ViewCollector pedig feliratkozik a változásokra.
| Módszer | API Level | Késleltetés | Részletesség | Energiafogyasztás |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | magas | alacsony | magas |
| NetworkCallback | 21+ | alacsony | magas | alacsony |
| ConnectivityManager.getActiveNetwork | 23+ | azonnali | közepes | nulla |
| NWPathMonitor (iOS) | iOS 12+ | alacsony | magas | alacsony |
Android 10-től kezdve a háttérkorlátozások szintje szigorodott, és a NetworkCallback előfordulhat, hogy nem hívódik meg, amikor az alkalmazás a háttérben van. Kritikusan fontos feladatokhoz — például adatbetöltés a hálózat megjelenésekor — használja a WorkManager-t NetworkType.CONNECTED korlátozással. A WorkManager garantálja a feladat végrehajtását a hálózati feltételek teljesülése esetén.
Android 12+ ban korlátozás jelent meg a BroadcastReceiver manifest regisztrációjára a CONNECTIVITY_ACTION számára. A fejlesztők kötelesek átállni NetworkCallback-re vagy WorkManager-t használni. A Google Play irányelv 2022 augusztusától megköveteli a manifest regisztráció eltávolítását ehhez a művelethez.
Gyakran Ismételt Kérdések
A BroadcastReceiver a CONNECTIVITY_CHANGE-el csak a hálózatváltozás tényét adja meg részletek nélkül, akár több másodperces késleltetéssel. NetworkCallback aszinkron módon működik, Network objektumot, interfész típust, kapcsolati képességeket biztosít, és nem igényel manifest regisztrációt, ami Android 12+ ban tiltott.
Android 10+ ban a háttérkorlátozások késleltethetik vagy nem hívhatják meg a NetworkCallback-et. Háttérfeladatokhoz használja a WorkManager-t NetworkType korlátozással — garantálja a munka elvégzését a feltételek teljesülése esetén, függetlenül az energiatakarékos módtól.
Hívja meg az unregisterNetworkCallback metódust a ConnectivityManager-en, átadva ugyanazt a callback példányt, amelyet a regisztrációnál használt. A nem törölt callback memóriaszivárgást okozhat, mivel a rendszer tárolja a referenciát. Mindig törölje az onStop vagy onDestroy metódusban.
A NetworkCallback API Level 21 (Android 5.0 Lollipop) től kezdve érhető el. Régebbi verziójú eszközökhöz használjon BroadcastReceiver-t vagy kompatibilitási könyvtárakat, mint az AndroidX Activity NetworkCallback, amelyek becsomagolják az API-t a szélesebb körű támogatáshoz.
Használja a ConnectivityManager.getActiveNetwork (API 23+) metódust a getNetworkCapabilities segítségével. A metódus szinkron módon visszaadja az aktuális aktív hálózatot, feliratkozás nélkül a változásokra. API 21-22 hez használja a getActiveNetworkInfo-t, amely újabb verziókban deprecated-ként van jelölve.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is