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 — 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.
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.
Î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.
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)
}
}
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ță.
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.
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 |
|---|---|---|
| onAvailable | Rețeaua este disponibilă pentru utilizare | Network — obiectul rețelei |
| onLost | Rețeaua este pierdută sau deconectată | Network — obiectul rețelei |
| onCapabilitiesChanged | S-au modificat capacitățile rețelei | Network, NetworkCapabilities |
| onBlockedStatusChanged | S-a modificat starea de blocare | Network, Boolean |
| onNetworkSuspended | Rețeaua este suspendată de sistem | Network |
| onNetworkResumed | Rețeaua este reluată după suspendare | Network |
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.
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ă.
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.
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
}
}
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.
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}")
}
}
}
Î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ârziere | Detaliere | Consum energetic |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | ridicată | scăzută | ridicat |
| NetworkCallback | 21+ | scăzută | ridicată | scăzut |
| ConnectivityManager.getActiveNetwork | 23+ | instantanee | medie | zero |
| NWPathMonitor (iOS) | iOS 12+ | scăzută | ridicată | scăzut |
Î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
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+.
Î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.
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.
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ă.
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
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.
Citiți și