NetworkCallback — ConnectivityManager vasitəsilə şəbəkə vəziyyətindəki dəyişiklikləri izləmək üçün Android SDK-da abstrakt sinifdir. Android Developers Documentation (2025)-ə görə, NetworkCallback-dən istifadə tətbiqə qoşulma, ayrılma və ya əlaqə xüsusiyyətlərindəki dəyişikliklərə vaxtında reaksiya verməyə imkan verir. ConnectivityManager.NetworkCallback sistem xidmətini daimi sorğulamadan şəbəkə növü, captive portallar və internet itkisi haqqında ətraflı məlumat verir.
Əsas məqamlar
NetworkCallback — android.net paketindən olan, Android SDK-nın tərkibinə daxil abstrakt sinifdir. ConnectivityManager sistem xidməti vasitəsilə şəbəkə əlaqəsi vəziyyətindəki dəyişikliklər haqqında bildirişlər almaq üçün nəzərdə tutulub.
NetworkCallback meydana gəlməzdən əvvəl tərtibatçılar şəbəkəni izləmək üçün BroadcastReceiver yayım qəbuledicilərindən istifadə edirdilər. Bu yanaşma manifestdə daimi qeydiyyat tələb edir, gecikmə ilə işləyir və əlaqə xüsusiyyətləri haqqında ətraflı məlumat vermirdi. Android 5.0 (API 21) NetworkCallback-i daha çevik və məhsuldar alternativ olaraq təqdim etdi.
Callback asinxron işləyir: tətbiq ConnectivityManager vasitəsilə hadisələrə abunə olur və şəbəkə vəziyyəti dəyişdikdə sistem callback metodlarını çağırır. Bu, şəbəkə statusunun dövri sorğulanması (polling) ehtiyacını aradan qaldıraraq batareya və prosessor resurslarına qənaət edir.
ConnectivityManager cihazın bütün şəbəkə interfeyslərini idarə edir — Wi-Fi, mobil məlumat, Ethernet, VPN. Bu interfeyslərdən hər hansı biri dəyişdikdə sistem Network obyekti yaradır və onu qeydiyyatdan keçirilmiş callback-in müvafiq metoduna ötürür. Hər Network-un unikal identifikatoru var, yenidən qoşulma zamanı dəyişir.
Callback konkret şəbəkə növünə bağlı deyil — eyni anda bütün mövcud interfeysləri izləyə bilər. Əlaqə növlərini filtrləmək üçün tələb olunan nəqliyyat protokollarını (Wi-Fi, mobil məlumat, Ethernet) və şəbəkə imkanlarını göstərən NetworkRequest sinfindən istifadə olunur.
NetworkCallback-in qeydiyyatı ConnectivityManager.registerNetworkCallback metodu vasitəsilə aparılır. Birinci parametr kimi şəbəkə tələblərini təsvir edən NetworkRequest.Builder, ikinci olaraq callback nümunəsi ötürülür. İşləmək üçün manifestdə ACCESS_NETWORK_STATE icazəsi tələb olunur.
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", "Mövcud: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "İtirildi: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
Tövsiyə olunur ki, NetworkCallback tətbiq ön planda olduqda qeydiyyatdan keçirilsin və fon keçdikdə ləğv edilsin. Activity-də callback-in həyat dövrünü idarə etmək üçün onStart və onStop-dan istifadə etmək rahatdır. Fragment-də — onResume və onPause.
Qeydiyyatın idarəsini asanlaşdırmaq üçün Lifecycle-aware komponentlərindən istifadə etmək olar. AndroidX Lifecycle kitabxanası həyat dövrü vəziyyəti dəyişdikdə avtomatik olaraq callback-i qeydiyyatdan keçirən və ləğv edən fərdi LifecycleObserver yaratmağa imkan verir.
Fon tapşırıqları üçün qeydiyyat Service və ya WorkManager-də aparılır. Nəzərə almaq lazımdır ki, Android 8+-da fon servislərinin işə salınmasında məhdudiyyətlər var. NetworkType ilə WorkManager — müəyyən şəbəkə vəziyyətində tapşırıqları yerinə yetirmək üçün daha etibarlı üsuldur, çünki uyğunluq API-i ilə inteqrasiya olunub və Doze rejimini nəzərə alır.
NetworkCallback şəbəkə vəziyyəti dəyişdikdə çağırılan metodlar dəsti təqdim edir. Bütün metodları yenidən təyin etmək məcburi deyil — yalnız tətbiqin konkret tapşırığı üçün lazım olanları həyata keçirmək kifayətdir. onAvailable və onLost əsas əlaqə monitorinqi üçün minimal tələb olunanlardır.
| Metod | Nə vaxt çağırılır | Parametrlər |
|---|---|---|
| onAvailable | Şəbəkə istifadəyə hazırdır | Network — şəbəkə obyekti |
| onLost | Şəbəkə itirilib və ya söndürülüb | Network — şəbəkə obyekti |
| onCapabilitiesChanged | Şəbəkə imkanları dəyişib | Network, NetworkCapabilities |
| onBlockedStatusChanged | Bloklama statusu dəyişib | Network, Boolean |
| onNetworkSuspended | Şəbəkə sistem tərəfindən dayandırılıb | Network |
| onNetworkResumed | Şəbəkə dayandırılmadan sonra bərpa olunub | Network |
Bu metod şəbəkə haqqında ətraflı məlumat əldə etmək üçün açardır. NetworkCapabilities parametri bayraqları ehtiva edir: NET_CAPABILITY_INTERNET — internetə çıxışın olması, NET_CAPABILITY_NOT_METERED — limitsiz əlaqə, NET_CAPABILITY_NOT_ROAMING — rouminqin olmaması. Həmçinin siqnal gecikməsi və ötürmə qabiliyyətini öyrənmək olar.
Captive portallar (captive portals) — ayrıca haldır: ictimai Wi-Fi şəbəkəsinə portal vasitəsilə qoşulduqda onCapabilitiesChanged metodu dərhal INTERNET göstərmir. Əvvəlcə şəbəkə mövcuddur, lakin internet yoxdur — brauzer vasitəsilə autorizasiya tələb olunur. Tərtibatçı tətbiq məntiqində bu gecikməni nəzərə almalıdır.
Sistem tətbiq üçün şəbəkə trafikini blokladıqda çağırılır — məsələn, məlumat qənaət rejimi və ya fon məlumatlarının məhdudlaşdırılması zamanı. onBlockedStatusChanged tətbiqə onun şəbəkə sorğularının müvəqqəti qadağan edildiyini öyrənməyə və lokal emalata keçməyə imkan verir.
İnternetə çıxışı izləmək və captive portalları idarə etmək üçün NetworkCallback-in praktik tətbiqini nəzərdən keçirək. Aşağıdakı nümunədə NET_CAPABILITY_INTERNET yoxlanışı və Google serverinə HTTP sorğusu vasitəsilə əlaqənin doğrulanması göstərilib.
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 məlumat bağlandı")
hasInternet ->
Log.d("Network", "Wi-Fi bağlandı")
else ->
Log.d("Network", "İnternetə giriş yoxdur")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Əlaqə itirildi: ${network}")
// Şəbəkə sorğularını dayandır
}
}
Avtorizasiya tələb edən ictimai şəbəkəyə (kafe, hava limanı) qoşulduqda sistem əvvəlcə onAvailable barədə məlumat verir, lakin onCapabilitiesChanged INTERNET göstərməyə bilər. Belə hallarda sabit endpoint-ə, məsələn https://www.google.com/generate_308 ünvanına HTTP sorğusu vasitəsilə əlavə yoxlama tələb olunur.
Sorğu 204 kodu qaytarırsa — internet var. Yönləndirmə (301, 302, 307) olarsa — brauzer vasitəsilə avtorizasiya tələb olunur. Bu halda portaldə autentifikasiyadan keçmək üçün WebView və ya Intent-i yönləndirmə URL-nə açmaq olar.
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", "İnternet mövcuddur")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal aşkarlandı")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Doğrulama uğursuz oldu: ${e.message}")
}
}
}
NetworkCallback-dən əvvəl şəbəkə monitorinqinin əsas üsulu android.net.conn.CONNECTIVITY_CHANGE filtri ilə BroadcastReceiver idi. Bu yanaşmanın əhəmiyyətli çatışmazlıqları var idi: bir neçə saniyə gecikmə, interfeys növü haqqında məlumatın olmaması, cihazın daimi oyanması səbəbindən artan enerji istehlakı.
Müasir alternativ — NetworkCallback ilə birlikdə LiveData və ya StateFlow. Nümunə ondan ibarətdir ki, callback reaktiv axına bükülür və avtomatik olaraq UI-ya vəziyyət dəyişikliyi barədə məlumat verir. Məsələn, NetworkStatus tipli MutableStateFlow callback metodları daxilində yenilənir, ViewCollector isə dəyişikliklərə abunə olur.
| Metod | API Level | Gecikmə | Detallaşdırma | Enerji istehlakı |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | yüksək | aşağı | yüksək |
| NetworkCallback | 21+ | aşağı | yüksək | aşağı |
| ConnectivityManager.getActiveNetwork | 23+ | ani | orta | sıfır |
| NWPathMonitor (iOS) | iOS 12+ | aşağı | yüksək | aşağı |
Android 10-dan başlayaraq fon məhdudiyyətləri səviyyəsi sərtləşdirilib və tətbiq fonda olduqda NetworkCallback çağırılmayaya bilər. Kritik vacib tapşırıqlar üçün — məsələn, şəbəkə görünəndə məlumatların yüklənməsi — NetworkType.CONNECTED məhdudiyyəti ilə WorkManager-dən istifadə edin. WorkManager şəbəkə şərtləri yerinə yetirildikdə tapşırığın icrasına zəmanət verir.
Android 12+-da CONNECTIVITY_ACTION üçün BroadcastReceiver-in manifest qeydiyyatı məhdudiyyəti yaranıb. Tərtibatçılar NetworkCallback-ə və ya WorkManager-ə keçməlidirlər. Google Play siyasəti 2022-ci ilin avqustundan bu aksiya üçün manifest qeydiyyatının silinməsini tələb edir.
Tez-tez verilən suallar
BroadcastReceiver CONNECTIVITY_CHANGE ilə yalnız şəbəkə dəyişməsi faktını verir, detalsız və bir neçə saniyəyə qədər gecikmə ilə. NetworkCallback asinxron işləyir, Network obyekti, interfeys növü, əlaqə imkanları təqdim edir və Android 12+-da qadağan olunmuş manifest qeydiyyatı tələb etmir.
Android 10+-da fon məhdudiyyətləri NetworkCallback-i gecikdirə və ya çağırmaya bilər. Fon tapşırıqları üçün NetworkType məhdudiyyəti ilə WorkManager istifadə edin — enerji qənaət rejimindən asılı olmayaraq şərtlər yerinə yetirildikdə işin görüləcəyinə zəmanət verir.
ConnectivityManager-də unregisterNetworkCallback metodunu çağırın, qeydiyyatda istifadə etdiyiniz eyni callback nümunəsini ötürün. Ləğv edilməmiş callback yaddaş sızmasına səbəb ola bilər, çünki sistem ona istinad saxlayır. Həmişə onStop və ya onDestroy-də ləğv edin.
NetworkCallback API Level 21 (Android 5.0 Lollipop)-dən etibarən mövcuddur. Köhnə versiyalı cihazlar üçün BroadcastReceiver və ya AndroidX Activity NetworkCallback kimi uyğunluq kitabxanalarından istifadə edin, onlar API-ni daha geniş dəstək üçün bükür.
getNetworkCapabilities ilə birlikdə ConnectivityManager.getActiveNetwork (API 23+) istifadə edin. Metod cari aktiv şəbəkəni sinxron qaytarır, dəyişikliklərə abunə olmadan. API 21-22 üçün getActiveNetworkInfo istifadə edin, o daha yeni versiyalarda deprecated kimi qeyd olunub.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun