Connectivity Manager, uygulamalara cihazın ağ bağlantı durumu hakkında bilgi sağlayan bir Android sistem hizmetidir. İnternet kullanılabilirliğini kontrol etme, ağ türünü (Wi-Fi, mobil veri, Ethernet) belirleme, bağlantı değişikliklerini izleme ve bağlantı kalitesine göre ağ isteklerini yönetme olanağı sağlar. Android Developers, 2025'e göre, ConnectivityManager ağ izleme için ana API'dir ve API Level 1'den itibaren Android Framework'ün bir parçasıdır.
Anahtar Noktalar
ConnectivityManager, Context.getSystemService(Context.CONNECTIVITY_SERVICE) aracılığıyla erişilebilen Android işletim sisteminin bir sistem hizmetidir. Cihazın ağ bağlantısı hakkında bilgi almak, ağ değişikliklerini izlemek ve uygulamanın ağ isteklerini yönetmek için bir API sağlar. Connectivity Manager, platformun ilk sürümünden (API Level 1) itibaren Android Framework'ün bir parçası olmuştur ve on yıllar boyunca basit getActiveNetworkInfo()'dan NetworkCallback ve NetworkRequest ile modern reaktif modele kadar önemli değişiklikler geçirmiştir.
Connectivity Manager'ın temel yetenekleri şunları içerir: aktif bir ağ bağlantısının varlığını kontrol etme, ağ türünü (Wi-Fi, mobil veri, Ethernet, Bluetooth, VPN) belirleme, ağ durumu değişikliklerini gerçek zamanlı izleme, bant genişliği ve gecikme hakkında bilgi alma ve uygulamanın ağ isteklerini yönetme. ConnectivityManager, Offline-First mimarisi, uyarlanabilir içerik yükleme ve bağlantı kalitesine göre uygulama optimizasyonu uygulamak için WorkManager ve Repository ile birlikte kullanılır.
Android 10 (API 29)'dan başlayarak Google, ConnectivityManager ile çalışma yaklaşımını değiştirdi. getActiveNetworkInfo() yöntemi kullanımdan kaldırıldı ve bunun yerine NetworkRequest ile registerDefaultNetworkCallback() veya registerNetworkCallback() kullanılması önerilir. Yeni API, kapsamlı portalları (kimlik doğrulamalı Wi-Fi) algılama ve bağlantı kalitesini değerlendirme yeteneği dahil olmak üzere daha ayrıntılı ağ bilgileri sağlar. ConnectivityManager ayrıca Jetpack ailesiyle de entegredir: ConnectivityManager kütüphanesi, Compose uygulamalarında ağ izlemeyi basitleştirmek için 2024 yılında Jetpack'in bir parçası olarak yayımlandı.
Modern Android mimarisinde Connectivity Manager, ağ istekleri hakkında kararlar almak için depo veya UseCase düzeyinde kullanılır. Depo Katmanı, API'yi çağırmadan önce ağ durumunu kontrol eder: ağ kullanılamıyorsa, yerel depolamadan (Room) veri döndürülür. Ağ kullanılabilirse, sunucuya bir istek yapılır ve sonuç Room'da saklanır. ViewModel, Room'dan bir Flow'a abone olur ve ağ etkileşiminin ayrıntılarını bilmez — bu, her katmanın bağımsız olarak test edilmesini sağlar.
Connectivity Manager, Linux çekirdeğinin ağ arabirimleriyle etkileşime giren connectivity sistem hizmetinden ağ durumu bilgisi alır. Cihaz Wi-Fi'a bağlandığında veya mobil veriyi açtığında, çekirdek sistem hizmetini bilgilendirir, sistem hizmeti iç durumunu günceller ve kayıtlı tüm geri çağırmaları bilgilendirir. ConnectivityManager'ın mimarisi Observer desenine dayanır: uygulama bir NetworkCallback kaydeder ve ağdaki herhangi bir değişiklik (bağlantı kurulumu, bağlantı kaybı, ağ türü değişikliği veya kalite düşüşü) hakkında bildirim alır.
Modern ConnectivityManager API, ağ olaylarını filtrelemek için NetworkRequest kullanır. NetworkRequest, ağ için gereksinimleri belirtmeye olanak tanır: aktarım (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET), internet yeteneği (NetworkCapabilities.NET_CAPABILITY_INTERNET) ve diğer kriterler. Büyük dosyaları indirmek için yalnızca Wi-Fi'ye ihtiyaç duyan bir uygulama, Transport.WIFI ile bir NetworkRequest oluşturur ve bir geri çağırma kaydeder. Sistem, mobil ağ olaylarını görmezden gelerek yalnızca Wi-Fi bağlantısı değiştiğinde uygulamayı bilgilendirir.
Android 12+'da Connectivity Manager'ın önemli bir özelliği yetenek tabanlı ağ oluşturmadır. Uygulama yalnızca “İnternet var mı?” diye kontrol etmez, hangi tür trafiğin kullanılabilir olduğunu değerlendirebilir. Örneğin, NET_CAPABILITY_NOT_METERED sınırsız bir bağlantıyı (Wi-Fi) belirtir, NET_CAPABILITY_NOT_ROAMING cihazın dolaşımda olmadığını belirtir. Bu, kararlar almayı sağlar: videoyu yalnızca Wi-Fi'da indir, dolaşımda senkronizasyonu ertele veya mobil veriyi yalnızca kritik istekler için kullan.
| API Level | Onerilen Yöntem | Durum |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | Kullanımdan Kaldırıldı |
| 21+ | NetworkCallback + registerNetworkCallback() | Onerilen |
| 24+ | registerDefaultNetworkCallback() | Onerilen |
| 28+ | getActiveNetwork() + NetworkCapabilities | Alternatif |
| 31+ | registerBestMatchingNetworkCallback() | Yeni API |
Bir Android uygulamasında Connectivity Manager kullanmak için izinler gereklidir. ACCESS_NETWORK_STATE, ağ bilgilerini okumak için zorunlu bir izindir ve AndroidManifest.xml'de bildirilir. Bu izin olmadan, ConnectivityManager getActiveNetwork() için null döndürür ve geri çağırmaları çağırmaz. Ağ işlemlerini gerçekleştirmek için INTERNET izni de gereklidir. Android 10 (API 29)'dan başlayarak, uygulama ek çalışma zamanı izinleri olmadan ağ durumunu kontrol edebilir — ACCESS_NETWORK_STATE normal bir izindir ve kurulum sırasında otomatik olarak verilir.
Modern Connectivity Manager, ağla çalışmak için birkaç temel yöntem sağlar. getActiveNetwork() (API 23+), mevcut aktif ağın Network nesnesini veya cihaz bağlı değilse null döndürür. Bu yöntem geri çağırma gerektirmez ve tek seferlik kontroller için uygundur. Network nesnesi, ayrıntılı bilgi almak için NetworkCapabilities'a aktarılabilir: aktarım türü, ölçümlü durum, dolaşım, internet yeteneği ve diğer özellikler.
registerDefaultNetworkCallback() (API 24+), ağı izlemenin tercih edilen yoludur. Uygulama, varsayılan ağda (uygulamanın trafik gönderdiği ağ) herhangi bir değişiklik olduğunda çağrılan bir geri çağırma kaydeder. Geri çağırma, yuvaları ve HTTP istemcilerini bağlamak için kullanılabilecek bir Network nesnesi alır. Bu yöntem, kullanımdan kaldırılan getActiveNetworkInfo()'nun yerini alır ve yoklama olmadan reaktif ağ izleme sağlar.
registerNetworkCallback() (API 21+), NetworkRequest aracılığıyla belirli bir ağ türündeki değişikliklere abone olmayı sağlar. Örneğin, bir uygulama new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() kullanarak yalnızca Wi-Fi ağlarını izleyebilir. Sistem, mobil ağ olaylarını etkilemeden Wi-Fi bağlantısı/kesilmesi hakkında uygulamayı bilgilendirir. NetworkCapabilities.getLinkDownstreamBandwidthKbps(), bağlantı hızına göre içerik kalitesini uyarlamaya olanak tanıyarak, kbit/s cinsinden aşağı yönlü bant genişliği tahminini döndürür.
| Yöntem | Minimum API | Amaç |
|---|---|---|
| getActiveNetwork() | 23 | Mevcut aktif ağı alma |
| getNetworkCapabilities() | 21 | Ağ yeteneklerini alma (tür, ölçümlü, dolaşım) |
| registerDefaultNetworkCallback() | 24 | Varsayılan ağı izleme |
| registerNetworkCallback() | 21 | NetworkRequest filtresiyle ağları izleme |
| unregisterNetworkCallback() | 21 | Geri çağırmayı kaydını iptal etme |
| getActiveNetworkInfo() | 1 | Kullanımdan kaldırıldı, kullanmayın |
Jetpack Connectivity kütüphanesi (androidx.core:core-ktx), Compose'da ConnectivityManager ile çalışmak için kullanışlı uzantılar sağlar. ConnectivityManager.observeAsState() işlevi, ağ değiştiğinde güncellenen bir State
ConnectivityManager.NetworkCallback, ağ durumu değiştiğinde sistem tarafından çağrılan yöntemlere sahip soyut bir sınıftır. onAvailable(Network) — bir ağ kullanılabilir olduğunda çağrılır. Uygulama, Network.bindSocket() aracılığıyla yuvaları bağlamak için kullanılabilecek bir Network nesnesi alır. onLost(Network) — bir ağ kullanılamaz hale geldiğinde çağrılır. Uygulama yerel verilere geçmeli veya bağlantı olmadığına dair bir mesaj göstermelidir. onCapabilitiesChanged(Network, NetworkCapabilities) — ağ özellikleri değiştiğinde çağrılır (örneğin, Wi-Fi'dan mobil veriye geçerken).
Ağ değişikliklerinin doğru şekilde ele alınması, bileşen yaşam döngüsünün dikkate alınmasını gerektirir. Geri çağırma kaydedilmelidir onStart()/onResume() içinde ve onStop()/onPause() içinde iptal edilmelidir. Geri çağırma iptal edilmezse, Activity yok edildikten sonra çalışmaya devam edebilir, bu da bellek sızıntılarına ve geri çağırma yok edilmiş bir bileşenin kullanıcı arayüzünü güncellemeye çalıştığında potansiyel NullPointerException'a neden olur. Otomatik kayıt yönetimi için lifecycleScope veya repeatOnLifecycle kullanın. Jetpack Compose'da, geri çağırmayı kaydetmek ve iptal etmek için DisposableEffect kullanın.
Kapsamlı portal işleme, Android 10'dan itibaren ConnectivityManager'ın önemli bir özelliğidir. CAPTIVE_PORTAL, bir Wi-Fi ağının kullanılabilir olduğu ancak bir web sayfası aracılığıyla kimlik doğrulama gerektirdiği bir senaryodur (havaalanları, oteller, kafeler). NetworkCapabilities.NET_CAPABILITY_VALIDATED, ağın tam internet erişimine sahip olduğunu belirtir. NET_CAPABILITY_VALIDATED yoksa, uygulama kapsamlı portal kimlik doğrulaması için bir tarayıcı açabilir. Android 11 (API 30)'de eklenen isCaptivePortal() yöntemi, kapsamlı portalları algılamak için kullanılır.
ConnectivityManager, requestNetwork() ve bindProcessToNetwork() aracılığıyla belirli amaçlar için bir ağ talep etmeye olanak tanır. Örneğin, büyük dosyaları indiren bir uygulama, mobil veri etkin olsa bile bir Wi-Fi ağı talep edebilir. Bunun için addTransportType(TRANSPORT_WIFI) ile bir NetworkRequest oluşturulur ve Wi-Fi kullanılabilir olduğunda sistem onAvailable()'ı çağırır. Uygulama, network.bindSocket() veya yapılandırılmış bir Network nesnesi ile OkHttp aracılığıyla yuvaları bu ağa bağlar. Bu, ağ arabirimlerinin kullanımı üzerinde esnek kontrol sağlar.
Clean Architecture'da modern API (NetworkCallback) ile ConnectivityManager kullanımının tam bir örneğine bakalım. NetworkMonitor, StateFlow aracılığıyla reaktif ağ durumu sağlayan, ConnectivityManager çevresinde bir sarmalayıcı sınıftır. ViewModel bu Flow'a abone olur ve durumu kullanıcı arayüzüne iletir. Repository, ağ istekleri hakkında kararlar almak için NetworkMonitor'u kullanır. Bu yaklaşım, test edilebilirliği ve platform bağımlılıklarının yalıtımını sağlar.
Aşağıdaki örnek, registerDefaultNetworkCallback ile ConnectivityManager'ın nasıl doğru kullanılacağını gösterir. NetworkMonitor sınıfı, sistem hizmetiyle çalışmayı kapsüller ve temiz bir Kotlin Flow
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, stateIn() aracılığıyla NetworkMonitor.isOnline'a abone olur ve durumu Compose'a iletir. Repository, API'yi çağırmadan önce mevcut isOnline.value değerini kontrol eder: false ise — Room'dan bir Flow döndürür. True ise — API'yi çağırır, sonucu Room'da kaydeder ve Room'dan bir Flow döndürür. WorkManager, arka plan görevlerini kısıtlamak için NetworkType.CONNECTED kullanır. NetworkMonitor testi, birim testlerinde herhangi bir ağ senaryosunu öykünmeye olanak tanıyan, mock ConnectivityManager nesnesi ve fake NetworkCallback ile yapılır.
ConnectivityManager ile çalışmanın ilk kuralı, kullanımdan kaldırılmış API'yi kullanmamaktır. getActiveNetworkInfo(), API 29'dan itibaren kullanımdan kaldırılmıştır ve yeni Android sürümlerinde hatalı veri döndürebilir. Bunun yerine, tek seferlik kontroller için getActiveNetwork() + getNetworkCapabilities() ve sürekli izleme için registerDefaultNetworkCallback() kullanın. Eski yöntem ayrıca kapsamlı portallı ağlarla tam internet erişimli ağları ayırt etmez ve bu da yanlış pozitiflere yol açar.
İkinci kural, geri çağırmayı her zaman iptal etmektir. Bir Activity onStart() içinde bir NetworkCallback kaydeder ancak onStop() içinde iptal etmezse, geri çağırma Activity yok edildikten sonra çalışmaya devam eder. Bu, bellek sızıntılarına ve geri çağırma yok edilmiş bir bileşenin kullanıcı arayüzünü güncellemeye çalıştığında potansiyel NullPointerException'a neden olur. Otomatik kayıt yönetimi için lifecycleScope veya repeatOnLifecycle kullanın. Jetpack Compose'da, geri çağırmayı kaydetmek ve iptal etmek için DisposableEffect kullanın.
Üçüncü sık yapılan hata, kaliteyi dikkate almadan yalnızca ağ kullanılabilirliğini kontrol etmektir. Basit bir “İnternet var mı?” karar vermek için yeterli değildir. Uygulama, büyük dosyaları indirmek için NET_CAPABILITY_NOT_METERED, arka planda senkronizasyon için NET_CAPABILITY_NOT_ROAMING ve internet erişimini onaylamak için NET_CAPABILITY_VALIDATED'yi kontrol etmelidir. Bu bayrakları görmezden gelmek, uygulamanın dolaşımda video indirmeye veya bir otelin kapsamlı portalı üzerinden veri senkronize etmeye çalışmasına neden olur.
Dördüncü kural, belirli bir sunucunun kullanılabilirliğini kontrol etmek için ConnectivityManager kullanmamaktır. ConnectivityManager cihazdaki ağ durumunu bildirir, ancak sunucuya erişilebileceğini garanti etmez. Bir API'nin kullanılabilirliğini kontrol etmek için kısa zaman aşımlı bir HTTP isteği veya Health Check kullanın. ConnectivityManager + HTTP ping güvenilir bir kombinasyondur: önce ağ varlığını kontrol edin, ardından gerçek erişilebilirliği onaylamak için sunucuya hafif bir istek yapın.
Birim testleri için, ağ durumlarını öykünmeye olanak tanıyan ShadowConnectivityManager ile Robolectric kullanın. Entegrasyon testleri için — Uçak Modu değiştirme ile Android Test Orchestrator. Testlerde şu senaryoları doğrulayın: çevrimiçiden çevrimdışına geçiş, mobil veri etkinken Wi-Fi görünmesi, istek sırasında ağ kaybı, kapsamlı portal, dolaşım. Birim testlerinde taklit için, platform bağımlılıkları olmadan bir mock nesnesiyle değiştirilebilen bir sarmalayıcı arabirim (örneğin, NetworkMonitorInterface) kullanın.
Sıkça Sorulan Sorular
Modern yöntem, onCapabilitiesChanged() içinde NET_CAPABILITY_INTERNET kontrolü ile registerDefaultNetworkCallback() kullanmaktır. Tek seferlik kontrol için: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. Kullanımdan kaldırılan getActiveNetworkInfo() yöntemi API 29+'dan itibaren önerilmez.
Ağ bilgilerini okumak için android.permission.ACCESS_NETWORK_STATE izni gereklidir. Bu normal bir izindir — uygulama kurulumunda otomatik olarak verilir ve çalışma zamanı talebi gerektirmez. Ağ işlemlerini (HTTP istekleri) gerçekleştirmek için INTERNET izni de gereklidir.
registerDefaultNetworkCallback() varsayılan ağı — uygulamanın ana trafiğini gönderdiği ağı — izler. registerNetworkCallback(NetworkRequest), belirli bir filtreyle (yalnızca Wi-Fi gibi) eşleşen ağları izler. Varsayılan geri çağırma daha basittir ve senaryoların %90'ını kapsar, özel istek ise belirli ağ türü gereksinimleri içindir.
NetworkCapabilities kullanın: Wi-Fi için caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI), mobil veri için hasTransport(TRANSPORT_CELLULAR). ConnectivityManager.getActiveNetworkInfo().getType() kullanmayın — bu yöntem kullanımdan kaldırılmıştır. NetworkCapabilities, connectivityManager.getNetworkCapabilities(network) aracılığıyla kullanılabilir.
getActiveNetworkInfo() yanlışlık nedeniyle kullanımdan kaldırıldı: kapsamlı portallı ağlarla tam internet erişimli ağları ayırt etmez ve bant genişliği veya dolaşım bilgisi sağlamaz. Android 10'dan itibaren bu yöntem, çoklu ağ bağlantıları için null veya hatalı veri döndürebilir. Alternatif, getActiveNetwork() + NetworkCapabilities'tir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun