NetworkCallback — ConnectivityManager orqali tarmoq holati o'zgarishlarini kuzatish uchun Android SDK-dagi abstrakt sinf. Android Developers Documentation (2025) ma'lumotlariga ko'ra, NetworkCallback dan foydalanish ilovaga ulanish, uzilish yoki ulanish xususiyatlarining o'zgarishiga o'z vaqtida reaksiya berish imkonini beradi. ConnectivityManager.NetworkCallback tizim xizmatini doimiy so'roq qilmasdan tarmoq turi, captive portallar va internet yo'qolishi haqida batafsil ma'lumot beradi.
Asosiy fikrlar
NetworkCallback — android.net paketidan olingan, Android SDK tarkibiga kiruvchi abstrakt sinf. U ConnectivityManager tizim xizmati orqali tarmoq ulanish holatidagi o'zgarishlar haqida bildirishnomalar olish uchun mo'ljallangan.
NetworkCallback paydo bo'lgunga qadar dasturchilar tarmoqni kuzatish uchun BroadcastReceiver eshittirish qabul qilgichlaridan foydalanardilar. Bunday yondashuv manifestda doimiy ro'yxatdan o'tkazishni talab qilar, kechikish bilan ishlar va ulanish xususiyatlari haqida batafsil ma'lumot bermas edi. Android 5.0 (API 21) NetworkCallback-ni yanada moslashuvchan va samarali alternativ sifatida taqdim etdi.
Callback asinxron ishlaydi: ilova ConnectivityManager orqali hodisalarga obuna bo'ladi va tarmoq holati o'zgarganda tizim callback metodlarini chaqiradi. Bu tarmoq holatini davriy so'roq qilish (polling) zaruriyatini bartaraf etib, batareya va protsessor resurslarini tejaydi.
ConnectivityManager qurilmaning barcha tarmoq interfeyslarini boshqaradi — Wi-Fi, mobil ma'lumotlar, Ethernet, VPN. Ushbu interfeyslardan birortasi o'zgarganda tizim Network obyektini yaratadi va uni ro'yxatdan o'tkazilgan callback-ning tegishli metodiga uzatadi. Har bir Network qayta ulanishda o'zgaradigan noyob identifikatorga ega.
Callback muayyan tarmoq turiga bog'liq emas — bir vaqtning o'zida barcha mavjud interfeyslarni kuzatishi mumkin. Ulanish turlarini filtrlash uchun talab qilinadigan transport protokollari (Wi-Fi, mobil ma'lumotlar, Ethernet) va tarmoq imkoniyatlari ko'rsatilgan NetworkRequest sinfidan foydalaniladi.
NetworkCallback-ni ro'yxatdan o'tkazish ConnectivityManager.registerNetworkCallback metodi orqali amalga oshiriladi. Birinchi parametr sifatida tarmoq talablarini tavsiflovchi NetworkRequest.Builder, ikkinchi sifatida callback namunasi uzatiladi. Ishlash uchun manifestda ACCESS_NETWORK_STATE ruxsati talab qilinadi.
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", "Mavjud: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Yo'qolgan: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
Tavsiya etiladiki, NetworkCallback ilova oldingi planda bo'lganda ro'yxatdan o'tkazilsin va fonda ketganda bekor qilinsin. Activity da callback ning hayot aylanishini boshqarish uchun onStart va onStop dan foydalanish qulay. Fragment da — onResume va onPause.
Ro'yxatdan o'tkazishni boshqarishni soddalashtirish uchun Lifecycle-aware komponentlaridan foydalanish mumkin. AndroidX Lifecycle kutubxonasi hayot aylanishi holati o'zgarganda avtomatik ravishda callback-ni ro'yxatdan o'tkazadigan va bekor qiladigan maxsus LifecycleObserver yaratish imkonini beradi.
Fon vazifalari uchun ro'yxatdan o'tkazish Service yoki WorkManager da amalga oshiriladi. Shuni hisobga olish kerakki, Android 8+ da fon xizmatlari ishga tushirishda cheklovlarga ega. NetworkType bilan WorkManager — muayyan tarmoq holatida vazifalarni bajarish uchun ishonchli usul, chunki u moslik API bilan integratsiyalangan va Doze rejimini hisobga oladi.
NetworkCallback tarmoq holati o'zgarganda chaqiriladigan metodlar to'plamini taqdim etadi. Barcha metodlarni qayta belgilash shart emas — faqat ilovaning muayyan vazifasi uchun zarur bo'lganlarini amalga oshirish kifoya. onAvailable va onLost asosiy ulanish monitoringi uchun minimal talab qilinadi.
| Metod | Qachon chaqiriladi | Parametrlar |
|---|---|---|
| onAvailable | Tarmoq foydalanishga tayyor | Network — tarmoq obyekti |
| onLost | Tarmoq yo'qolgan yoki o'chirilgan | Network — tarmoq obyekti |
| onCapabilitiesChanged | Tarmoq imkoniyatlari o'zgargan | Network, NetworkCapabilities |
| onBlockedStatusChanged | Bloklash holati o'zgargan | Network, Boolean |
| onNetworkSuspended | Tarmoq tizim tomonidan to'xtatilgan | Network |
| onNetworkResumed | Tarmoq to'xtatilgandan keyin qayta tiklangan | Network |
Bu metod tarmoq haqida batafsil ma'lumot olish uchun kalit hisoblanadi. NetworkCapabilities parametri bayroqlarni o'z ichiga oladi: NET_CAPABILITY_INTERNET — internetga kirish mavjudligi, NET_CAPABILITY_NOT_METERED — cheklanmagan ulanish, NET_CAPABILITY_NOT_ROAMING — rouming yo'qligi. Shuningdek signal kechikishi va o'tkazish qobiliyatini bilish mumkin.
Captive portallar (captive portals) — alohida holat: jamoat Wi-Fi tarmog'iga portal orqali ulanganda onCapabilitiesChanged metodi darhol INTERNET ko'rsatmaydi. Avval tarmoq mavjud, lekin internetsiz — brauzer orqali avtorizatsiya talab qilinadi. Dasturchi ilova mantiqida bu kechikishni hisobga olishi kerak.
Tizim ilova uchun tarmoq trafigini bloklaganda chaqiriladi — masalan, ma'lumotlarni tejash rejimi yoki fon ma'lumotlarini cheklashda. onBlockedStatusChanged ilovaga uning tarmoq so'rovlari vaqtincha taqiqlanganligini bilishga va mahalliy ishlov berishga o'tishga imkon beradi.
Internetga kirishni kuzatish va captive portallarni boshqarish uchun NetworkCallback-ni amaliy qo'llashni ko'rib chiqamiz. Quyidagi misolda NET_CAPABILITY_INTERNET tekshiruvi va Google serveriga HTTP so'rovi orqali ulanishni tasdiqlash ko'rsatilgan.
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 ma'lumot ulandi")
hasInternet ->
Log.d("Network", "Wi-Fi ulandi")
else ->
Log.d("Network", "Internetga kirish yo'q")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Ulanish yo'qoldi: ${network}")
// Tarmoq so'rovlarini to'xtatish
}
}
Avtorizatsiya talab qiladigan jamoat tarmog'iga (kafe, aeroport) ulanganda tizim avval onAvailable haqida xabar beradi, lekin onCapabilitiesChanged INTERNET ko'rsatmasligi mumkin. Bunday hollarda barqaror endpoint-ga, masalan https://www.google.com/generate_204 manziliga HTTP so'rovi orqali qo'shimcha tekshirish talab qilinadi.
Agar so'rov 204 kodini qaytarsa — internet mavjud. Agar qayta yo'naltirish (301, 302, 307) bo'lsa — brauzer orqali avtorizatsiya talab qilinadi. Bu holda portaldan autentifikatsiyadan o'tish uchun WebView yoki Intent-ni qayta yo'naltirish URL-iga ochish mumkin.
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 mavjud")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal aniqlandi")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Tasdiqlash muvaffaqiyatsiz: ${e.message}")
}
}
}
NetworkCallback dan oldin tarmoq monitoringining asosiy usuli android.net.conn.CONNECTIVITY_CHANGE filtri bilan BroadcastReceiver edi. Bu yondashuv muhim kamchiliklarga ega edi: bir necha soniya kechikish, interfeys turi haqida ma'lumot yo'qligi, qurilmaning doimiy uyg'onishi tufayli yuqori energiya sarfi.
Zamonaviy alternativ — NetworkCallback bilan birgalikda LiveData yoki StateFlow. Naqsh callback-ni reaktiv oqimga o'rashdan iborat bo'lib, u avtomatik ravishda UI-ga holat o'zgarishi haqida xabar beradi. Masalan, NetworkStatus tipidagi MutableStateFlow callback metodlari ichida yangilanadi, ViewCollector esa o'zgarishlarga obuna bo'ladi.
| Usul | API Level | Kechikish | Tafsilot | Energiya sarfi |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | yuqori | past | yuqori |
| NetworkCallback | 21+ | past | yuqori | past |
| ConnectivityManager.getActiveNetwork | 23+ | darhol | o'rtacha | nol |
| NWPathMonitor (iOS) | iOS 12+ | past | yuqori | past |
Android 10 dan boshlab fon cheklovlari darajasi qattiqlashtirilgan va ilova fonda bo'lganda NetworkCallback chaqirilmasligi mumkin. Kritik muhim vazifalar uchun — masalan, tarmoq paydo bo'lganda ma'lumotlarni yuklash — NetworkType.CONNECTED cheklovi bilan WorkManager dan foydalaning. WorkManager tarmoq shartlari bajarilganda vazifaning bajarilishini kafolatlaydi.
Android 12+ da CONNECTIVITY_ACTION uchun BroadcastReceiver ning manifest ro'yxatdan o'tkazish cheklovi paydo bo'ldi. Dasturchilar NetworkCallback ga yoki WorkManager ga o'tishlari shart. Google Play siyosati 2022 yil avgustidan boshlab bu harakat uchun manifest ro'yxatdan o'tkazishni olib tashlashni talab qiladi.
Tez-tez beriladigan savollar
BroadcastReceiver CONNECTIVITY_CHANGE bilan faqat tarmoq o'zgarishi faktini beradi, tafsilotsiz va bir necha soniyagacha kechikish bilan. NetworkCallback asinxron ishlaydi, Network obyekti, interfeys turi, ulanish imkoniyatlarini taqdim etadi va Android 12+ da taqiqlangan manifest ro'yxatdan o'tkazishni talab qilmaydi.
Android 10+ da fon cheklovlari NetworkCallback ni kechiktirishi yoki chaqirmasligi mumkin. Fon vazifalari uchun NetworkType cheklovi bilan WorkManager dan foydalaning — energiya tejash rejimidan qat'iy nazar shartlar bajarilganda ishning bajarilishini kafolatlaydi.
ConnectivityManager da unregisterNetworkCallback metodini chaqiring, ro'yxatdan o'tkazishda ishlatilgan bir xil callback namunasini uzating. Bekor qilinmagan callback xotira sizib ketishiga sabab bo'lishi mumkin, chunki tizim unga havolani saqlaydi. Har doim onStop yoki onDestroy da bekor qiling.
NetworkCallback API Level 21 (Android 5.0 Lollipop) dan boshlab mavjud. Eskiroq versiyadagi qurilmalar uchun BroadcastReceiver yoki AndroidX Activity NetworkCallback kabi moslik kutubxonalaridan foydalaning, ular API-ni kengroq qo'llab-quvvatlash uchun o'rab oladi.
getNetworkCapabilities bilan birgalikda ConnectivityManager.getActiveNetwork (API 23+) dan foydalaning. Metod joriy faol tarmoqni sinxron qaytaradi, o'zgarishlarga obuna bo'lmasdan. API 21-22 uchun getActiveNetworkInfo dan foydalaning, u yangi versiyalarda deprecated deb belgilangan.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.