NetworkCallback — en abstrakt klass i Android SDK för att övervaka nätverksstatusförändringar via ConnectivityManager. Enligt Android Developers Documentation (2025) gör användningen av NetworkCallback det möjligt för appen att i tid reagera på anslutning, frånkoppling eller ändring av anslutningsegenskaper. ConnectivityManager.NetworkCallback ger detaljerad information om nätverkstyp, captive portals och internetförlust utan konstant polling av systemtjänsten.
Huvudpunkter
NetworkCallback — är en abstrakt klass från paketet android.net, som ingår i Android SDK. Den är avsedd för att ta emot meddelanden om ändringar i nätverksanslutningsstatus via systemtjänsten ConnectivityManager.
Innan NetworkCallback kom använde utvecklare sändningsmottagare BroadcastReceiver för nätverksspårning. Detta tillvägagångssätt krävde konstant registrering i manifestet, fungerade med fördröjning och gav inte detaljerad information om anslutningsegenskaper. Android 5.0 (API 21) introducerade NetworkCallback som ett mer flexibelt och effektivt alternativ.
Callback fungerar asynkront: appen prenumererar på händelser via ConnectivityManager och systemet anropar callback-metoder när nätverksstatusen ändras. Detta eliminerar behovet av periodisk polling av nätverksstatus, vilket sparar batteri- och processorresurser.
ConnectivityManager hanterar alla nätverksgränssnitt på enheten — Wi-Fi, mobildata, Ethernet, VPN. När något av dessa gränssnitt ändras skapar systemet ett Network-objekt och skickar det till lämplig metod i den registrerade callbcken. Varje Network har en unik identifierare som ändras vid återanslutning.
Callbcken är inte bunden till en specifik nätverkstyp — den kan spåra alla tillgängliga gränssnitt samtidigt. För filtrering av anslutningstyper används klassen NetworkRequest, där erforderliga transportprotokoll (Wi-Fi, mobildata, Ethernet) och nätverkskapacitet anges.
Registrering av NetworkCallback görs via metoden ConnectivityManager.registerNetworkCallback. Den första parametern är NetworkRequest.Builder som beskriver nätverkskraven, den andra — en instans av callbcken. För att fungera krävs behörigheten ACCESS_NETWORK_STATE i manifestet.
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", "Tillgängligt: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Förlorat: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
Det rekommenderas att registrera NetworkCallback när appen är i förgrunden och avregistrera när den går till bakgrunden. I Activity är det bekvämt att använda onStart och onStop för att hantera callbackens livscykel. I Fragment — onResume och onPause.
För att förenkla registreringshanteringen kan Lifecycle-aware-komponenter användas. Biblioteket AndroidX Lifecycle gör det möjligt att skapa en anpassad LifecycleObserver som automatiskt registrerar och avregistrerar callbcken när livscykelstatusen ändras.
För bakgrundsuppgifter görs registrering i Service eller WorkManager. Det är viktigt att tänka på att i Android 8+ har bakgrundstjänster begränsningar för start. WorkManager med NetworkType — ett mer tillförlitligt sätt att utföra uppgifter vid en viss nätverksstatus, eftersom det är integrerat med kompatibilitets-API och tar hänsyn till Doze-läget.
NetworkCallback tillhandahåller en uppsättning metoder som anropas när nätverksstatusen ändras. Alla metoder behöver inte överskrivas — det räcker att implementera endast de som behövs för appens specifika uppgift. onAvailable och onLost är minimalt nödvändiga för grundläggande anslutningsövervakning.
| Metod | När den anropas | Parametrar |
|---|---|---|
| onAvailable | Nätverket är tillgängligt för användning | Network — nätverksobjekt |
| onLost | Nätverket förlorat eller frånkopplat | Network — nätverksobjekt |
| onCapabilitiesChanged | Nätverkskapaciteten har ändrats | Network, NetworkCapabilities |
| onBlockedStatusChanged | Blockeringstatus har ändrats | Network, Boolean |
| onNetworkSuspended | Nätverket har pausats av systemet | Network |
| onNetworkResumed | Nätverket har återupptagits efter paus | Network |
Denna metod är nyckeln till att få detaljerad information om nätverket. Parametern NetworkCapabilities innehåller flaggor: NET_CAPABILITY_INTERNET — tillgång till internet, NET_CAPABILITY_NOT_METERED — obegränsad anslutning, NET_CAPABILITY_NOT_ROAMING — ingen roaming. Man kan även ta reda på signalfördröjning och bandbredd.
Captive portals — ett separat fall: vid anslutning till ett offentligt Wi-Fi-nätverk via en portal visar metoden onCapabilitiesChanged inte omedelbart INTERNET. Först är nätverket tillgängligt, men utan internet — auktorisering via webbläsare krävs. Utvecklaren måste ta hänsyn till denna fördröjning i applogiken.
Anropas när systemet blockerar nätverkstrafik för appen — till exempel vid aktivering av databesparingsläge eller begränsning av bakgrundsdata. onBlockedStatusChanged gör att appen kan veta att dess nätverksförfrågningar är tillfälligt förbjudna och växla till lokal bearbetning.
Låt oss titta på praktisk implementering av NetworkCallback för att spåra internetåtkomst och hantera captive portals. I exemplet nedan visas kontroll av NET_CAPABILITY_INTERNET och validering av anslutningen via en HTTP-förfrågan till Googles server.
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", "Mobildata ansluten")
hasInternet ->
Log.d("Network", "Wi-Fi ansluten")
else ->
Log.d("Network", "Ingen internetåtkomst")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Anslutning förlorad: ${network}")
// Stoppa nätverksförfrågningar
}
}
Vid anslutning till ett offentligt nätverk med auktorisering (kafé, flygplats) rapporterar systemet först onAvailable, men onCapabilitiesChanged kanske inte visar INTERNET. I sådana fall krävs ytterligare kontroll via en HTTP-förfrågan till en stabil endpoint, till exempel https://www.google.com/generate_204.
Om förfrågan returnerar kod 204 — finns internet. Om omdirigering (301, 302, 307) — krävs auktorisering via webbläsare. I detta fall kan WebView eller Intent öppnas till omdirigerings-URL:en för autentisering på portalen.
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 är tillgängligt")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal upptäckt")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Validering misslyckades: ${e.message}")
}
}
}
Före NetworkCallback var det huvudsakliga sättet att övervaka nätverket BroadcastReceiver med filtret android.net.conn.CONNECTIVITY_CHANGE. Detta tillvägagångssätt hade betydande nackdelar: flera sekunders fördröjning, brist på information om gränssnittstyp, ökad energiförbrukning på grund av konstant väckning av enheten.
Modernt alternativ — LiveData eller StateFlow i kombination med NetworkCallback. Mönstret består i att slå in callbcken i en reaktiv ström som automatiskt meddelar UI om statusändringar. Till exempel uppdateras MutableStateFlow med typen NetworkStatus inuti callback-metoderna och ViewCollector prenumererar på ändringar.
| Metod | API Level | Fördröjning | Detaljnivå | Energiförbrukning |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | hög | låg | hög |
| NetworkCallback | 21+ | låg | hög | låg |
| ConnectivityManager.getActiveNetwork | 23+ | omedelbar | medel | noll |
| NWPathMonitor (iOS) | iOS 12+ | låg | hög | låg |
Från och med Android 10 har nivån av bakgrundsbegränsningar skärpts och NetworkCallback kanske inte anropas när appen är i bakgrunden. För kritiskt viktiga uppgifter — till exempel laddning av data när nätverket dyker upp — använd WorkManager med begränsningen NetworkType.CONNECTED. WorkManager garanterar utförande av uppgiften när nätverksvillkoren är uppfyllda.
I Android 12+ har en begränsning införts för manifestregistrering av BroadcastReceiver för CONNECTIVITY_ACTION. Utvecklare är skyldiga att migrera till NetworkCallback eller använda WorkManager. Google Plays policy från augusti 2022 kräver borttagning av manifestregistrering för denna åtgärd.
Vanliga frågor
BroadcastReceiver med CONNECTIVITY_CHANGE ger bara faktumet av nätverksändring utan detaljer och med en fördröjning på upp till flera sekunder. NetworkCallback fungerar asynkront, tillhandahåller Network-objekt, gränssnittstyp, anslutningsmöjligheter och kräver ingen manifestregistrering, vilket är förbjudet i Android 12+.
I Android 10+ kan bakgrundsbegränsningar fördröja eller inte anropa NetworkCallback. För bakgrundsuppgifter använd WorkManager med NetworkType-begränsning — det garanterar att arbetet utförs när villkoren är uppfyllda oavsett energisparläge.
Anropa metoden unregisterNetworkCallback på ConnectivityManager och skicka samma callback-instans som användes vid registreringen. En ej avregistrerad callback kan orsaka minnesläcka eftersom systemet behåller en referens till den. Avregistrera alltid i onStop eller onDestroy.
NetworkCallback är tillgänglig från API Level 21 (Android 5.0 Lollipop). För enheter med äldre versioner använd BroadcastReceiver eller kompatibilitetsbibliotek som AndroidX Activity NetworkCallback som omsluter API:et för bredare stöd.
Använd ConnectivityManager.getActiveNetwork (API 23+) tillsammans med getNetworkCapabilities. Metoden returnerar det aktuella aktiva nätverket synkront, utan prenumeration på ändringar. För API 21-22 använd getActiveNetworkInfo som är markerad som deprecated i nyare versioner.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också