NetworkCallback: vad är det, tillämpning och nätverkshantering i Android

Författare: IT Sectr Publicerad: 2026-03-10 Lästid: 9 min

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 — inbyggd abstrakt klass i Android SDK för att spåra nätverksstatus via ConnectivityManager.
  • Metoden onAvailable anropas när enheten ansluter till nätverket och skickar ett Network-objekt med anslutningsdetaljer.
  • Metoden onLost utlöses vid förlust av nätverksanslutning och gör att appen kan stoppa nätverksförfrågningar.
  • Metoden onCapabilitiesChanged meddelar om ändring av nätverkskapacitet — uppkomst av internet, captive portal eller betald anslutning.
  • Registrering görs via registerNetworkCallback, avregistrering — via unregisterNetworkCallback i appens livscykel.

Vad är NetworkCallback?

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.

Hur callback fungerar i Android

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.

Hur man registrerar NetworkCallback i appen

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.

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

Registrering i Activity och Fragment

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.

Registrering i tjänst

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.

Huvudmetoder i NetworkCallback

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.

MetodNär den anropasParametrar
onAvailableNätverket är tillgängligt för användningNetwork — nätverksobjekt
onLostNätverket förlorat eller frånkopplatNetwork — nätverksobjekt
onCapabilitiesChangedNätverkskapaciteten har ändratsNetwork, NetworkCapabilities
onBlockedStatusChangedBlockeringstatus har ändratsNetwork, Boolean
onNetworkSuspendedNätverket har pausats av systemetNetwork
onNetworkResumedNätverket har återupptagits efter pausNetwork

Metoden onCapabilitiesChanged

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.

Metoden onBlockedStatusChanged

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.

Exempel på implementering av NetworkCallback

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.

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

Hantering av captive portals

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.

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

Skillnader från andra sätt att övervaka nätverk

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.

MetodAPI LevelFördröjningDetaljnivåEnergiförbrukning
BroadcastReceiver1+höglåghög
NetworkCallback21+låghöglåg
ConnectivityManager.getActiveNetwork23+omedelbarmedelnoll
NWPathMonitor (iOS)iOS 12+låghöglåg

Arbete med bakgrundsläge

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

Vad är skillnaden mellan NetworkCallback och BroadcastReceiver för nätverk?

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

Kan NetworkCallback användas i bakgrundsläge?

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.

Hur avregistrerar man NetworkCallback?

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.

Vilken Android-version krävs minimum för NetworkCallback?

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.

Hur kontrollerar man aktuell nätverksstatus utan callback?

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

  • NetworkCallback — abstrakt klass i Android SDK för asynkron nätverksövervakning via ConnectivityManager utan konstant polling.
  • Metoden onAvailable meddelar om nätverksanslutning, onLost — om förlust av anslutning, onCapabilitiesChanged — om ändring av nätverkskapacitet.
  • Registrering görs via registerNetworkCallback med angivande av NetworkRequest och callback-instans.
  • Livscykel kräver avregistrering i onStop för Activity och onPause för Fragment.
  • Captive portals hanteras via en extra HTTP-förfrågan till generate_204 för att kontrollera verklig internetåtkomst.
  • NetworkCallback har ersatt BroadcastReceiver för CONNECTIVITY_ACTION som är förbjuden i manifestet på Android 12+.
  • För bakgrundsuppgifter använd WorkManager med NetworkType.CONNECTED istället för direkt registrering av NetworkCallback.

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.

Diskutera projektet

Läs också