Connectivity Manager — cihazın şəbəkə qoşulma vəziyyəti haqqında tətbiqlərə məlumat verən Android sistem xidmətidir. İnternet mövcudluğunu yoxlamağa, şəbəkə növünü (Wi-Fi, mobil məlumatlar, Ethernet) təyin etməyə, qoşulmadakı dəyişiklikləri izləməyə və rabitə keyfiyyətindən asılı olaraq şəbəkə sorğularını idarə etməyə imkan verir. Android Developers, 2025 məlumatına görə, ConnectivityManager şəbəkə monitorinqi üçün əsas API-dir və API Level 1-dən başlayaraq Android Framework-ün tərkibinə daxildir.
Əsas məqamlar
ConnectivityManager — Context.getSystemService(Context.CONNECTIVITY_SERVICE) vasitəsilə əldə edilə bilən Android əməliyyat sisteminin sistem xidmətidir. O, cihazın şəbəkə qoşulması haqqında məlumat əldə etmək, şəbəkə dəyişikliklərini izləmək və tətbiqin şəbəkə sorğularını idarə etmək üçün API təqdim edir. ConnectivityManager platformanın ilk versiyasından (API Level 1) Android Framework-ün bir hissəsidir və onilliklər ərzində əhəmiyyətli dəyişikliklərə məruz qalmışdır: sadə getActiveNetworkInfo()-dan NetworkCallback və NetworkRequest ilə müasir reaktiv modelə qədər.
Connectivity Manager-in əsas imkanlarına daxildir: aktiv şəbəkə qoşulmasının mövcudluğunu yoxlamaq, şəbəkə növünü təyin etmək (Wi-Fi, mobil məlumatlar, Ethernet, Bluetooth, VPN), şəbəkə vəziyyətinin dəyişikliklərini real vaxtda izləmək, ötürmə qabiliyyəti və gecikmələr haqqında məlumat əldə etmək, tətbiqin şəbəkə sorğularını idarə etmək. ConnectivityManager Offline-First arxitekturasını, adaptiv məzmun yükləməni və əlaqə keyfiyyətindən asılı olaraq tətbiqin işini optimallaşdırmağı həyata keçirmək üçün WorkManager və Repository ilə birlikdə istifadə olunur.
Android 10-dan (API 29) başlayaraq, Google ConnectivityManager ilə işə yanaşmanı dəyişdi. getActiveNetworkInfo() metodu deprecated elan edildi və onun əvəzinə registerDefaultNetworkCallback() və ya NetworkRequest ilə registerNetworkCallback() istifadə etmək tövsiyə olunur. Yeni API əsir portalları (avtorizasiya tələb edən Wi-Fi) aşkarlamaq və əlaqə keyfiyyətini qiymətləndirmək imkanı da daxil olmaqla, şəbəkə haqqında daha ətraflı məlumat verir. ConnectivityManager həmçinin Jetpack ailəsi ilə inteqrasiya olunub: ConnectivityManager kitabxanası 2024-cü ildə Compose tətbiqlərində şəbəkə monitorinqini sadələşdirmək üçün Jetpack-in bir hissəsi kimi buraxılıb.
Müasir Android arxitekturasında Connectivity Manager API çağırışları haqqında qərarlar qəbul etmək üçün repository və ya UseCase səviyyəsində istifadə olunur. Repository təbəqəsi API-ni çağırmazdan əvvəl şəbəkə vəziyyətini yoxlayır: şəbəkə əlçatmazdırsa, məlumatlar yerli anbardan (Room) qaytarılır. Şəbəkə əlçatandırsa, serverə sorğu göndərilir və nəticə Room-da saxlanılır. ViewModel Room-dan Flow-a abunə olur və şəbəkə qarşılıqlı əlaqəsinin təfərrüatlarını bilmir — bu, hər bir təbəqəni müstəqil şəkildə asanlıqla test etməyə imkan verir.
Connectivity Manager şəbəkə vəziyyəti haqqında məlumatı Linux nüvəsinin şəbəkə interfeysləri ilə əlaqə quran connectivity sistem xidmətindən alır. Cihaz Wi-Fi-a qoşulduqda və ya mobil məlumatları yandırdıqda, nüvə sistem xidmətinə xəbər verir, o da daxili vəziyyəti yeniləyir və bütün qeydiyyatdan keçmiş geri çağırışları xəbərdar edir. Arxitektura ConnectivityManager Observer nümunəsi üzərində qurulub: tətbiq NetworkCallback-i qeydiyyatdan keçirir və şəbəkədəki hər hansı dəyişikliklər — qoşulmanın yaranması, itirilməsi, şəbəkə növünün dəyişməsi və ya keyfiyyətin pisləşməsi barədə bildirişlər alır.
Müasir ConnectivityManager API-si şəbəkə hadisələrini filtrləmək üçün NetworkRequest-dən istifadə edir. NetworkRequest şəbəkəyə olan tələbləri müəyyən etməyə imkan verir: nəqliyyat (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET), İnternetə çıxış imkanı (NetworkCapabilities.NET_CAPABILITY_INTERNET) və digər meyarlar. Tətbiq böyük faylları yükləmək üçün yalnız Wi-Fi-a ehtiyac duyarsa, Transport.WIFI ilə NetworkRequest yaradır və geri çağırışı qeydiyyatdan keçirir. Sistem yalnız Wi-Fi qoşulması dəyişdikdə tətbiqə xəbər verəcək, mobil şəbəkə hadisələrini nəzərə almayacaq.
Android 12+-da Connectivity Manager-in vacib xüsusiyyəti capabilities-based networking-dir. Tətbiq sadəcə "İnternet var ya yox" yoxlamır, hansı növ trafikin mövcud olduğunu qiymətləndirə bilir. Məsələn, NET_CAPABILITY_NOT_METERED limitsiz qoşulmanı (Wi-Fi), NET_CAPABILITY_NOT_ROAMING isə cihazın rouminqdə olmadığını göstərir. Bu, qərarlar qəbul etməyə imkan verir: videonu yalnız Wi-Fi ilə yükləmək, rouminqdə sinxronizasiyanı təxirə salmaq və ya mobil məlumatları yalnız kritik sorğular üçün istifadə etmək.
| API Level | Tövsiyə olunan metod | Status |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | Deprecated |
| 21+ | NetworkCallback + registerNetworkCallback() | Tövsiyə olunur |
| 24+ | registerDefaultNetworkCallback() | Tövsiyə olunur |
| 28+ | getActiveNetwork() + NetworkCapabilities | Alternativ |
| 31+ | registerBestMatchingNetworkCallback() | Yeni API |
Android tətbiqində Connectivity Manager-dən istifadə etmək üçün icazələr tələb olunur. ACCESS_NETWORK_STATE — şəbəkə haqqında məlumatı oxumaq üçün məcburi icazə, AndroidManifest.xml-də bəyan edilir. Bu icazə olmadan ConnectivityManager getActiveNetwork() üçün null qaytaracaq və geri çağırışları çağırmayacaq. Şəbəkə əməliyyatlarını yerinə yetirmək üçün həmçinin INTERNET icazəsi tələb olunur. Android 10-dan (API 29) başlayaraq, tətbiq əlavə runtime icazələri olmadan şəbəkə vəziyyətini yoxlaya bilər — ACCESS_NETWORK_STATE normal icazədir və quraşdırma zamanı avtomatik verilir.
Müasir Connectivity Manager şəbəkə ilə işləmək üçün bir neçə əsas metod təqdim edir. getActiveNetwork() (API 23+) cari aktiv şəbəkənin Network obyektini və ya cihaz qoşulmayıbsa null qaytarır. Bu metod geri çağırış tələb etmir və birdəfəlik yoxlama üçün uyğundur. Network obyekti ətraflı məlumat əldə etmək üçün NetworkCapabilities-ə ötürülə bilər: nəqliyyat növü, metered statusu, rouminq, İnternetə çıxış imkanı və digər xüsusiyyətlər.
registerDefaultNetworkCallback() (API 24+) — şəbəkə monitorinqi üçün üstünlük verilən üsul. Tətbiq standart şəbəkədə (tətbiqin trafik göndərdiyi şəbəkə) hər hansı dəyişiklik olduqda çağırılan geri çağırışı qeydiyyatdan keçirir. Geri çağırış soketləri və HTTP müştərilərini bağlamaq üçün istifadə edilə bilən Network obyekti alır. Bu metod köhnəlmiş getActiveNetworkInfo()-nı əvəz edir və polling olmadan reaktiv şəbəkə monitorinqini təmin edir.
registerNetworkCallback() (API 21+) NetworkRequest vasitəsilə müəyyən şəbəkə növünün dəyişikliklərinə abunə olmağa imkan verir. Məsələn, tətbiq new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() vasitəsilə yalnız Wi-Fi şəbəkələrini izləyə bilər. Sistem mobil şəbəkə hadisələrinə toxunmadan Wi-Fi-a qoşulma/ayrılma barədə tətbiqə xəbər verəcək. NetworkCapabilities.getLinkDownstreamBandwidthKbps() aşağı istiqamətli kanalın ötürmə qabiliyyətini kbps ilə qaytarır ki, bu da məzmun keyfiyyətini əlaqə sürətinə uyğunlaşdırmağa imkan verir.
| Metod | Minimal API | Məqsəd |
|---|---|---|
| getActiveNetwork() | 23 | Cari aktiv şəbəkənin əldə edilməsi |
| getNetworkCapabilities() | 21 | Şəbəkə imkanlarının əldə edilməsi (növ, metered, rouminq) |
| registerDefaultNetworkCallback() | 24 | Standart şəbəkənin monitorinqi |
| registerNetworkCallback() | 21 | NetworkRequest filtrinə uyğun şəbəkələrin monitorinqi |
| unregisterNetworkCallback() | 21 | Geri çağırışın qeydiyyatının ləğvi |
| getActiveNetworkInfo() | 1 | Köhnəlmiş (deprecated), istifadə etməyin |
Jetpack Connectivity kitabxanası (androidx.core:core-ktx) Compose-da ConnectivityManager ilə işləmək üçün rahat genişlənmələr təqdim edir. ConnectivityManager.observeAsState() funksiyası şəbəkə dəyişdikdə yenilənən State<Boolean> qaytarır. @Composable NetworkStatus() komponenti qoşulma statusunu göstərir və dəyişikliklər olduqda avtomatik yenidən çəkilir. Bu, tərtibatçını geri çağırışları və Activity/Fragment həyat dövrünü əl ilə idarə etməkdən azad edir.
ConnectivityManager.NetworkCallback — şəbəkə vəziyyəti dəyişdikdə sistem tərəfindən çağırılan metodları olan abstrakt sinifdir. onAvailable(Network) — şəbəkə əlçatan olduqda çağırılır. Tətbiq Network.bindSocket() vasitəsilə soketləri bağlamaq üçün istifadə edilə bilən Network obyekti alır. onLost(Network) — şəbəkə əlçatmaz olduqda çağırılır. Tətbiq yerli məlumatlara keçməli və ya əlaqənin olmaması barədə mesaj göstərməlidir. onCapabilitiesChanged(Network, NetworkCapabilities) — şəbəkə xüsusiyyətləri dəyişdikdə çağırılır (məsələn, Wi-Fi-dan mobil məlumatlara keçid zamanı).
Şəbəkə dəyişikliklərinin düzgün idarə edilməsi komponentin həyat dövrünü nəzərə almalıdır. Geri çağırış qeydiyyatdan keçirilməlidir onStart()/onResume() daxilində və ləğv edilməlidir onStop()/onPause() daxilində. Geri çağırış ləğv edilməzsə, Activity məhv edildikdən sonra da çağırıla bilər ki, bu da yaddaş sızmasına səbəb olur. Jetpack ViewModel arxitekturasında geri çağırışı qeydiyyatdan keçirmək üçün lifecycleScope istifadə etmək tövsiyə olunur ki, ViewModel təmizlənərkən avtomatik ləğv edilsin. Xidmətlər və fon tapşırıqları üçün NetworkType məhdudiyyəti ilə WorkManager istifadə olunur.
Captive portalların idarə edilməsi — Android 10-dan başlayaraq ConnectivityManager-in vacib imkanıdır. CAPTIVE_PORTAL — Wi-Fi şəbəkəsinin mövcud olduğu, lakin veb səhifə vasitəsilə avtorizasiya tələb etdiyi ssenaridir (hava limanları, otellər, kafelər). NetworkCapabilities.NET_CAPABILITY_VALIDATED şəbəkənin İnternetə tam çıxışı olduğunu göstərir. NET_CAPABILITY_VALIDATED yoxdursa, tətbiq captive portal vasitəsilə avtorizasiya üçün brauzeri aça bilər. Captive portalı aşkar etmək üçün Android 11-də (API 30) əlavə edilmiş isCaptivePortal() metodu istifadə olunur.
ConnectivityManager requestNetwork() və bindProcessToNetwork() vasitəsilə konkret məqsədlər üçün şəbəkə tələb etməyə imkan verir. Məsələn, böyük faylları yükləmək üçün tətbiq mobil şəbəkə aktiv olsa belə Wi-Fi şəbəkəsi tələb edə bilər. Bunun üçün addTransportType(TRANSPORT_WIFI) ilə NetworkRequest yaradılır və Wi-Fi göründükdə sistem onAvailable()-ı çağırır. Tətbiq soketləri network.bindSocket() və ya konfiqurasiya edilmiş Network obyekti ilə OkHttp vasitəsilə bu şəbəkəyə bağlayır. Bu, şəbəkə interfeyslərindən istifadə üzərində çevik nəzarət verir.
Clean Architecture-da müasir API (NetworkCallback) ilə ConnectivityManager-dən istifadənin tam nümunəsini nəzərdən keçirək. NetworkMonitor — StateFlow vasitəsilə reaktiv şəbəkə statusu təmin edən ConnectivityManager üzərində sarğı sinfi. ViewModel bu Flow-a abunə olur və vəziyyəti UI-ya ötürür. Repository şəbəkə sorğuları haqqında qərarlar qəbul etmək üçün NetworkMonitor-dan istifadə edir. Bu yanaşma test edilə bilənliyi və platforma asılılıqlarının izolyasiyasını təmin edir.
Aşağıdakı nümunə registerDefaultNetworkCallback ilə ConnectivityManager-dən necə düzgün istifadə olunacağını göstərir. NetworkMonitor sinfi sistem xidməti ilə işi inkapsulə edir və təmiz Kotlin Flow<Boolean> təqdim edir. Başlanğıcda geri çağırışı qeydiyyatdan keçirir və həyat dövrü başa çatdıqda ləğv edir. Asinxron iş korutinlər və callbackFlow vasitəsilə təmin edilir — ConnectivityManager-in geri çağırış üslubu ilə Kotlin-in reaktiv Flow üslubu arasında körpü.
class NetworkMonitor(
private val connectivityManager: ConnectivityManager
) {
val isOnline: StateFlow<Boolean> = callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
trySend(true)
}
override fun onLost(network: Network) {
trySend(false)
}
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val connected = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
trySend(connected)
}
}
connectivityManager.registerDefaultNetworkCallback(callback)
awaitClose {
connectivityManager.unregisterNetworkCallback(callback)
}
}.stateIn(
CoroutineScope(Dispatchers.Default),
SharingStarted.WhileSubscribed(5000),
initialValue = checkInitialState()
)
private fun checkInitialState(): Boolean {
val network = connectivityManager.getActiveNetwork() ?: return false
val caps = connectivityManager.getNetworkCapabilities(network) ?: return false
return caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
}
}
ViewModel NetworkMonitor.isOnline-a stateIn() vasitəsilə abunə olur və vəziyyəti Compose-a ötürür. Repository API-ni çağırmazdan əvvəl isOnline.value cari dəyərini yoxlayır: false olarsa, Room-dan Flow qaytarır. True olarsa, API-ni çağırır, nəticəni Room-da saxlayır və Room-dan Flow qaytarır. WorkManager fon tapşırıqlarını məhdudlaşdırmaq üçün NetworkType.CONNECTED istifadə edir. NetworkMonitor-un test edilməsi mock ConnectivityManager obyekti və fake NetworkCallback ilə aparılır ki, bu da vahid testlərdə istənilən şəbəkə ssenarilərini emulyasiya etməyə imkan verir.
ConnectivityManager ilə işin birinci qaydası — köhnəlmiş API-dən istifadə etməməkdir. getActiveNetworkInfo() API 29-dan etibarən deprecated-dir və Android-in yeni versiyalarında yanlış məlumatlar qaytara bilər. Onun əvəzinə birdəfəlik yoxlama üçün getActiveNetwork() + getNetworkCapabilities(), davamlı monitorinq üçün isə registerDefaultNetworkCallback() istifadə edin. Köhnə metod captive portalı olan şəbəkələri tam İnternetə çıxışı olan şəbəkələrdən fərqləndirmir, bu da yalan nəticələrə səbəb olur.
İkinci qayda — həmişə geri çağırışın qeydiyyatını ləğv edin. Activity onStart()-da NetworkCallback-i qeydiyyatdan keçirir, lakin onStop()-da ləğv etməzsə, geri çağırış Activity məhv edildikdən sonra da işləməyə davam edir. Bu, yaddaş sızmasına və geri çağırış məhv edilmiş komponentin UI-nı yeniləməyə çalışdıqda potensial NullPointerException-a səbəb olur. Qeydiyyatı avtomatik idarə etmək üçün lifecycleScope və ya repeatOnLifecycle istifadə edin. Jetpack Compose-da geri çağırışı qeydiyyatdan keçirmək və ləğv etmək üçün DisposableEffect istifadə edin.
Üçüncü ümumi səhv — şəbəkənin keyfiyyətini nəzərə almadan yalnız mövcudluğunu yoxlamaqdır. Sadəcə "İnternet var" qərar qəbul etmək üçün kifayət deyil. Tətbiq böyük faylları yükləmək üçün NET_CAPABILITY_NOT_METERED, fonda sinxronizasiya üçün NET_CAPABILITY_NOT_ROAMING, İnternetə çıxışı təsdiqləmək üçün NET_CAPABILITY_VALIDATED yoxlamalıdır. Bu bayraqları nəzərə almamaq tətbiqin rouminqdə video yükləməyə və ya otelin captive portalı vasitəsilə məlumatları sinxronizasiya etməyə cəhd etməsinə səbəb olur.
Dördüncü — konkret serverin əlçatanlığını yoxlamaq üçün ConnectivityManager-dən istifadə etməyin. ConnectivityManager cihazdakı şəbəkə vəziyyəti haqqında məlumat verir, lakin serverin əlçatan olduğuna zəmanət vermir. API-nin əlçatanlığını yoxlamaq üçün qısa timeout ilə HTTP sorğusu və ya Health Check istifadə edin. ConnectivityManager + HTTP ping etibarlı kombinasiyadır: əvvəlcə şəbəkənin mövcudluğu yoxlanılır, sonra real əlçatanlığı təsdiqləmək üçün serverə yüngül sorğu göndərilir.
Vahid testlər üçün şəbəkə vəziyyətini emulyasiya etməyə imkan verən ShadowConnectivityManager ilə Robolectric istifadə edin. İnteqrasiya testləri üçün — Təyyarə rejimini dəyişən Android Test Orchestrator. Testlərdə ssenariləri yoxlayın: onlayndan offlayna keçid, aktiv mobil şəbəkə olduqda Wi-Fi-nın görünməsi, sorğunun icrası zamanı şəbəkənin itirilməsi, captive portal, rouminq. Modul testlərində mock etmək üçün platforma asılılıqları olmayan mock obyekti ilə əvəz edilə bilən sarğı interfeysindən (məsələn, NetworkMonitorInterface) istifadə edin.
Tez-tez verilən suallar
Müasir üsul — onCapabilitiesChanged-də NET_CAPABILITY_INTERNET yoxlaması ilə registerDefaultNetworkCallback() istifadə etməkdir. Birdəfəlik yoxlama üçün: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. Köhnəlmiş getActiveNetworkInfo() metodu API 29+-da tövsiyə edilmir.
Şəbəkə haqqında məlumatı oxumaq üçün android.permission.ACCESS_NETWORK_STATE icazəsi tələb olunur. Bu normal icazədir (normal permission) — tətbiq quraşdırılarkən avtomatik verilir və runtime sorğusu tələb etmir. Şəbəkə əməliyyatlarını (HTTP sorğuları) yerinə yetirmək üçün həmçinin INTERNET icazəsi tələb olunur.
registerDefaultNetworkCallback() standart şəbəkəni — tətbiqin əsas trafik göndərdiyi şəbəkəni izləyir. registerNetworkCallback(NetworkRequest) verilmiş filtrə uyğun şəbəkələri izləyir (məsələn, yalnız Wi-Fi). Standart geri çağırış daha sadədir və ssenarilərin 90%-ni əhatə edir, fərdi request isə şəbəkə növünə xüsusi tələblər üçündür.
NetworkCapabilities istifadə edin: Wi-Fi üçün caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI), mobil məlumatlar üçün hasTransport(TRANSPORT_CELLULAR). ConnectivityManager.getActiveNetworkInfo().getType() istifadə etməyin — bu metod deprecated-dir. NetworkCapabilities connectivityManager.getNetworkCapabilities(network) vasitəsilə əldə edilə bilər.
getActiveNetworkInfo() qeyri-dəqiqlik səbəbindən köhnəlmişdir: captive portalı olan şəbəkələri tam İnternetə çıxışı olan şəbəkələrdən fərqləndirmir, ötürmə qabiliyyəti və rouminq haqqında məlumat vermir. Android 10-dan başlayaraq, bu metod çoxkanallı qoşulmalar (multi-network) üçün null və ya yanlış məlumatlar qaytara bilər. Əvəzedici — getActiveNetwork() + NetworkCapabilities.
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