Connectivity Manager: nedir, yöntemler ve bağlantı izleme

Yazar: IT Sectr Yayınlanma: 2026-03-10 Okuma süresi: 9 dk

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

  • Connectivity Manager — cihazın ağ bağlantısını izlemek için bir Android sistem hizmeti.
  • NetworkCallback — geri çağırma kaydı yoluyla ağ değişikliklerini izlemek için birincil mekanizma.
  • NetworkCapabilities — mevcut ağın yetenekleri (Wi-Fi, mobil veri, VPN, Ethernet) hakkında ayrıntılı bilgi sağlayan bir sınıf.
  • NetworkRequest — tanımlanmış özelliklere sahip belirli ağ türlerine abone olmak için bir filtre.
  • getActiveNetworkInfo() — kullanımdan kaldırılmış bir yöntem (API 29'dan itibaren kullanımdan kaldırıldı), NetworkCallback ve registerDefaultNetworkCallback ile değiştirildi.

Connectivity Manager Nedir?

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ı.

Uygulama Mimarisinde Connectivity Manager'ın Rolü

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 Nasıl Çalışır

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 LevelOnerilen YöntemDurum
1-22getActiveNetworkInfo()Kullanımdan Kaldırıldı
21+NetworkCallback + registerNetworkCallback()Onerilen
24+registerDefaultNetworkCallback()Onerilen
28+getActiveNetwork() + NetworkCapabilitiesAlternatif
31+registerBestMatchingNetworkCallback()Yeni API

Connectivity Manager için İzinler

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.

Connectivity Manager'ın Ana Yöntemleri

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öntemMinimum APIAmaç
getActiveNetwork()23Mevcut aktif ağı alma
getNetworkCapabilities()21Ağ yeteneklerini alma (tür, ölçümlü, dolaşım)
registerDefaultNetworkCallback()24Varsayılan ağı izleme
registerNetworkCallback()21NetworkRequest filtresiyle ağları izleme
unregisterNetworkCallback()21Geri çağırmayı kaydını iptal etme
getActiveNetworkInfo()1Kullanımdan kaldırıldı, kullanmayın

Jetpack Compose'da ConnectivityManager

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 döndürür. @Composable NetworkStatus() bileşeni bağlantı durumunu görüntüler ve değişikliklerde otomatik olarak yeniden çizilir. Bu, geliştiriciyi geri çağırmaları ve Activity/Fragment yaşam döngüsünü manuel olarak yönetmekten kurtarır.

NetworkCallback ve Ağ Değişikliklerini Ele Alma

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.

Belirli Amaçlar İçin Ağ (NetworkRequest)

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.

Kotlin'de Uygulama Örneği

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 sağlar. Başlangıçta geri çağırmayı kaydeder ve yaşam döngüsünün sonunda iptal eder. Zaman uyumsuz çalışma, coroutines ve callbackFlow — ConnectivityManager'ın geri çağırma stili ile Kotlin'in reaktif Flow stili arasında bir köprü — aracılığıyla sağlanır.

kotlin
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 ve Repository'de NetworkMonitor Kullanımı

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.

En İyi Uygulamalar ve Sık Yapılan Hatalar

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.

ConnectivityManager Testi

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

Cihazın internete bağlı olup olmadığını nasıl kontrol ederim?

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.

ConnectivityManager için hangi izin gereklidir?

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 ve registerNetworkCallback arasındaki fark nedir?

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.

Ağ türünü nasıl belirlerim: Wi-Fi mı mobil veri mi?

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() neden kullanımdan kaldırıldı?

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

  • ConnectivityManager — ağ bağlantısını izlemek için Android sistem hizmeti, getSystemService(CONNECTIVITY_SERVICE) aracılığıyla erişilebilir.
  • Modern API — registerDefaultNetworkCallback() + NetworkCapabilities, API 29'dan itibaren kullanımdan kaldırılan getActiveNetworkInfo()'nun yerini alır.
  • NetworkCapabilities — ağ türünü (Wi-Fi, Cellular), ölçümlemeyi, dolaşımı ve internet bağlantısı doğrulamayı kontrol etmek için sınıf.
  • NetworkCallback — ağ değişikliklerini izlemek için onAvailable, onLost ve onCapabilitiesChanged yöntemleriyle reaktif izleme mekanizması.
  • NetworkRequest — hassas kontrol için registerNetworkCallback() ile kullanılan, belirli bir türdeki ağlara abone olmak için filtre.
  • ACCESS_NETWORK_STATE izni — ConnectivityManager ile çalışmak için zorunlu, uygulama kurulumunda otomatik olarak verilir.
  • En iyi uygulamalar — geri çağırmaları onStop() içinde iptal edin, NET_CAPABILITY_NOT_METERED ve NET_CAPABILITY_VALIDATED'yi kontrol edin, kalite kontrolü olmadan yalnızca ağ varlığına güvenmeyin.

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.

Projeyi tartış

Ayrıca okuyun