NetworkCallback: ce este, aplicare și gestionare rețea în Android

Autor: IT Sectr Publicat: 2026-03-10 Timp de citire: 9 min

NetworkCallback — o clasă abstractă în Android SDK pentru monitorizarea modificărilor stării rețelei prin ConnectivityManager. Conform Android Developers Documentation (2025), utilizarea NetworkCallback permite aplicației să reacționeze prompt la conectare, deconectare sau modificarea caracteristicilor conexiunii. ConnectivityManager.NetworkCallback oferă informații detaliate despre tipul rețelei, portalele captive și pierderea internetului fără interogarea constantă a serviciului de sistem.

Principalele puncte

  • NetworkCallback — o clasă abstractă integrată Android SDK pentru urmărirea stării rețelei prin ConnectivityManager.
  • Metoda onAvailable este apelată la conectarea dispozitivului la rețea, transmițând obiectul Network cu detalii despre conexiune.
  • Metoda onLost se declanșează la pierderea conexiunii de rețea, permițând aplicației să oprească solicitările de rețea.
  • Metoda onCapabilitiesChanged notifică despre modificarea capacităților rețelei — apariția internetului, a portalului captiv sau a conexiunii cu plată.
  • Înregistrarea se face prin registerNetworkCallback, anularea — prin unregisterNetworkCallback în ciclul de viață al aplicației.

Ce este NetworkCallback?

NetworkCallback — este o clasă abstractă din pachetul android.net, care face parte din Android SDK. Este destinată primirii notificărilor despre modificările stării conexiunii de rețea prin serviciul de sistem ConnectivityManager.

Înainte de apariția NetworkCallback, dezvoltatorii foloseau receptoare de difuzare BroadcastReceiver pentru urmărirea rețelei. Această abordare necesita înregistrare constantă în manifest, funcționa cu întârziere și nu oferea informații detaliate despre caracteristicile conexiunii. Android 5.0 (API 21) a introdus NetworkCallback ca o alternativă mai flexibilă și mai performantă.

Callback-ul funcționează asincron: aplicația se abonează la evenimente prin ConnectivityManager, iar sistemul apelează metodele callback la modificarea stării rețelei. Aceasta elimină necesitatea interogării periodice (polling) a stării rețelei, economisind resursele bateriei și ale procesorului.

Cum funcționează callback-ul în Android

ConnectivityManager gestionează toate interfețele de rețea ale dispozitivului — Wi-Fi, date mobile, Ethernet, VPN. La modificarea oricăreia dintre aceste interfețe, sistemul creează un obiect Network și îl transmite în metoda corespunzătoare a callback-ului înregistrat. Fiecare Network are un identificator unic care se schimbă la reconectare.

Callback-ul nu este legat de un anumit tip de rețea — poate urmări toate interfețele disponibile simultan. Pentru filtrarea tipurilor de conexiuni se folosește clasa NetworkRequest, unde se specifică protocoalele de transport necesare (Wi-Fi, date celulare, Ethernet) și capacitățile rețelei.

Cum să înregistrezi NetworkCallback în aplicație

Înregistrarea NetworkCallback se face prin metoda ConnectivityManager.registerNetworkCallback. Primul parametru este NetworkRequest.Builder care descrie cerințele pentru rețea, al doilea — o instanță a callback-ului. Pentru funcționare este necesară permisiunea ACCESS_NETWORK_STATE în manifest.

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", "Disponibilă: ${network}")
        }

        override fun onLost(network: Network) {
            Log.d("Network", "Pierdută: ${network}")
        }
    }

    fun register() {
        connectivityManager.registerNetworkCallback(
            NetworkRequest.Builder().build(), callback
        )
    }

    fun unregister() {
        connectivityManager.unregisterNetworkCallback(callback)
    }
}

Înregistrarea în Activity și Fragment

Se recomandă înregistrarea NetworkCallback în momentul când aplicația este în prim-plan și anularea la trecerea în fundal. În Activity este convenabil de folosit onStart și onStop pentru gestionarea ciclului de viață al callback-ului. În Fragment — onResume și onPause.

Pentru simplificarea gestionării înregistrării se pot folosi componente Lifecycle-aware. Biblioteca AndroidX Lifecycle permite crearea unui LifecycleObserver personalizat care înregistrează și anulează automat callback-ul la modificarea stării ciclului de viață.

Înregistrarea în serviciu

Pentru sarcinile de fundal, înregistrarea se face în Service sau WorkManager. Este important de reținut că în Android 8+ serviciile de fundal au restricții de pornire. WorkManager cu NetworkType — o modalitate mai fiabilă pentru executarea sarcinilor la o anumită stare a rețelei, deoarece este integrat cu API-ul de compatibilitate și ține cont de modul Doze.

Metodele principale NetworkCallback

NetworkCallback oferă un set de metode care sunt apelate la modificarea stării rețelei. Nu toate metodele trebuie suprascrise — este suficient să implementați doar cele necesare pentru sarcina specifică a aplicației. onAvailable și onLost sunt minim necesare pentru monitorizarea de bază a conexiunii.

MetodăCând este apelatăParametri
onAvailableRețeaua este disponibilă pentru utilizareNetwork — obiectul rețelei
onLostRețeaua este pierdută sau deconectatăNetwork — obiectul rețelei
onCapabilitiesChangedS-au modificat capacitățile rețeleiNetwork, NetworkCapabilities
onBlockedStatusChangedS-a modificat starea de blocareNetwork, Boolean
onNetworkSuspendedRețeaua este suspendată de sistemNetwork
onNetworkResumedRețeaua este reluată după suspendareNetwork

Metoda onCapabilitiesChanged

Această metodă este cheia pentru obținerea informațiilor detaliate despre rețea. Parametrul NetworkCapabilities conține flaguri: NET_CAPABILITY_INTERNET — acces la internet, NET_CAPABILITY_NOT_METERED — conexiune nelimitată, NET_CAPABILITY_NOT_ROAMING — fără roaming. De asemenea, se poate afla întârzierea semnalului și lățimea de bandă.

Portalele captive (captive portals) — un caz separat: la conectarea la o rețea Wi-Fi publică printr-un portal, metoda onCapabilitiesChanged nu arată imediat INTERNET. Mai întâi rețeaua este disponibilă, dar fără internet — este necesară autorizarea prin browser. Dezvoltatorul trebuie să țină cont de această întârziere în logica aplicației.

Metoda onBlockedStatusChanged

Este apelată când sistemul blochează traficul de rețea pentru aplicație — de exemplu, la activarea modului de economisire a datelor sau la limitarea datelor de fundal. onBlockedStatusChanged permite aplicației să afle că solicitările sale de rețea sunt temporar interzise și să treacă la procesarea locală.

Exemple de implementare NetworkCallback

Să analizăm implementarea practică a NetworkCallback pentru urmărirea accesului la internet și gestionarea portalelor captive. În exemplul de mai jos este arătată verificarea NET_CAPABILITY_INTERNET și validarea conexiunii printr-o solicitare HTTP către serverul 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", "Date mobile conectate")
            hasInternet ->
                Log.d("Network", "Wi-Fi conectat")
            else ->
                Log.d("Network", "Fără acces la internet")
        }
    }

    override fun onLost(network: Network) {
        Log.d("Network", "Conexiune pierdută: ${network}")
        // Oprește solicitările de rețea
    }
}

Gestionarea portalelor captive

La conectarea la o rețea publică cu autorizare (cafenea, aeroport), sistemul raportează mai întâi onAvailable, dar onCapabilitiesChanged poate să nu arate INTERNET. În astfel de cazuri este necesară o verificare suplimentară printr-o solicitare HTTP către un endpoint stabil, de exemplu https://www.google.com/generate_204.

Dacă solicitarea returnează codul 204 — internetul este disponibil. Dacă redirecționare (301, 302, 307) — este necesară autorizarea prin browser. În acest caz, se poate deschide WebView sau Intent către URL-ul de redirecționare pentru autentificare pe portal.

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", "Internetul este disponibil")
                in HttpURLConnection.HTTP_MOVED_PERM
                        ..HttpURLConnection.HTTP_TEMP_REDIRECT ->
                    Log.d("Network", "Portal captiv detectat")
            }
            connection.disconnect()
        } catch (e: Exception) {
            Log.e("Network", "Validare eșuată: ${e.message}")
        }
    }
}

Diferențe față de alte metode de monitorizare a rețelei

Înainte de NetworkCallback, principala metodă de monitorizare a rețelei era BroadcastReceiver cu filtrul android.net.conn.CONNECTIVITY_CHANGE. Această abordare avea dezavantaje semnificative: întârziere de câteva secunde, lipsa informațiilor despre tipul interfeței, consum energetic ridicat din cauza trezirii constante a dispozitivului.

Alternativa modernă — LiveData sau StateFlow împreună cu NetworkCallback. Modelul constă în împachetarea callback-ului într-un flux reactiv care notifică automat UI-ul despre modificarea stării. De exemplu, MutableStateFlow cu tipul NetworkStatus este actualizat în interiorul metodelor callback, iar ViewCollector se abonează la modificări.

MetodăAPI LevelÎntârziereDetaliereConsum energetic
BroadcastReceiver1+ridicatăscăzutăridicat
NetworkCallback21+scăzutăridicatăscăzut
ConnectivityManager.getActiveNetwork23+instantaneemediezero
NWPathMonitor (iOS)iOS 12+scăzutăridicatăscăzut

Lucrul cu modul de fundal

Începând cu Android 10, nivelul restricțiilor de fundal a fost înăsprit și NetworkCallback poate să nu fie apelat când aplicația este în fundal. Pentru sarcinile critic de importante — de exemplu, încărcarea datelor la apariția rețelei — utilizați WorkManager cu restricția NetworkType.CONNECTED. WorkManager garantează executarea sarcinii la îndeplinirea condițiilor de rețea.

În Android 12+ a apărut restricția privind înregistrarea în manifest a BroadcastReceiver pentru CONNECTIVITY_ACTION. Dezvoltatorii sunt obligați să migreze la NetworkCallback sau să utilizeze WorkManager. Politica Google Play din august 2022 solicită eliminarea înregistrării în manifest pentru această acțiune.

Întrebări frecvente

Care este diferența dintre NetworkCallback și BroadcastReceiver pentru rețea?

BroadcastReceiver cu CONNECTIVITY_CHANGE oferă doar faptul modificării rețelei fără detalii și cu o întârziere de până la câteva secunde. NetworkCallback funcționează asincron, oferă obiectul Network, tipul interfeței, capacitățile conexiunii și nu necesită înregistrare în manifest, care este interzisă în Android 12+.

Se poate utiliza NetworkCallback în modul de fundal?

În Android 10+ restricțiile de fundal pot întârzia sau nu apela NetworkCallback. Pentru sarcinile de fundal utilizați WorkManager cu restricția NetworkType — garantează executarea lucrării la îndeplinirea condițiilor, indiferent de modul de economisire a energiei.

Cum se anulează înregistrarea NetworkCallback?

Apelați metoda unregisterNetworkCallback pe ConnectivityManager, transmițând aceeași instanță de callback folosită la înregistrare. Un callback neanulat poate provoca scurgeri de memorie, deoarece sistemul păstrează o referință către el. Anulați întotdeauna în onStop sau onDestroy.

Ce versiune Android este minim necesară pentru NetworkCallback?

NetworkCallback este disponibil începând cu API Level 21 (Android 5.0 Lollipop). Pentru dispozitivele cu versiuni mai vechi, utilizați BroadcastReceiver sau biblioteci de compatibilitate precum AndroidX Activity NetworkCallback, care împachetează API-ul pentru o compatibilitate mai largă.

Cum se verifică starea curentă a rețelei fără callback?

Utilizați ConnectivityManager.getActiveNetwork (API 23+) împreună cu getNetworkCapabilities. Metoda returnează rețeaua activă curentă sincron, fără abonare la modificări. Pentru API 21-22 utilizați getActiveNetworkInfo, care este marcat ca deprecated în versiunile mai noi.

Rezumat

  • NetworkCallback — clasă abstractă Android SDK pentru monitorizarea asincronă a rețelei prin ConnectivityManager fără interogare constantă.
  • Metoda onAvailable notifică despre conectarea la rețea, onLost — despre pierderea conexiunii, onCapabilitiesChanged — despre modificarea capacităților rețelei.
  • Înregistrarea se face prin registerNetworkCallback cu specificarea NetworkRequest și a instanței callback.
  • Ciclul de viață necesită anularea înregistrării în onStop pentru Activity și onPause pentru Fragment.
  • Portalele captive sunt gestionate printr-o solicitare HTTP suplimentară către generate_204 pentru verificarea accesului real la internet.
  • NetworkCallback a înlocuit BroadcastReceiver pentru CONNECTIVITY_ACTION, care este interzis în manifest pe Android 12+.
  • Pentru sarcinile de fundal utilizați WorkManager cu NetworkType.CONNECTED în locul înregistrării directe a NetworkCallback.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și