Android, uygulamaların bağlantıdaki dinamik değişiklikler hakkında bilgi edinmesini sağlar. Bağlantı değişikliklerini izlemek ve bunlara yanıt vermek için aşağıdaki sınıfları kullanın:
ConnectivityManager
, uygulamanıza sistemdeki bağlantı durumunu bildirir.Network
sınıfı, cihazın bağlı olduğu ağlardan birini temsil eder.ConnectivityManager
ile ağ hakkında bilgi toplamak veya ağdaki soketleri bağlamak içinNetwork
nesnesi anahtar olarak kullanabilirsiniz. Ağ bağlantısı kesildiğindeNetwork
nesnesi kullanılamaz hale gelir. Cihaz daha sonra aynı cihaza yeniden bağlansa bile yeniNetwork
nesnesi yeni ağı temsil eder.LinkProperties
nesnesi, bir ağın bağlantısıyla ilgili bilgileri (ör. DNS sunucularının listesi, yerel IP adresleri ve ağ için yüklenen ağ yolları) içerir.NetworkCapabilities
nesnesi, bir ağın özellikleri (ör. aktarım araçları [kablosuz, mobil, Bluetooth]) ve ağın yapabilecekleriyle ilgili bilgileri içerir. Örneğin, ağın MMS gönderip gönderemediğini, giriş portalı kullanıp kullanmadığını veya ücretli olup olmadığını belirlemek için nesneyi sorgulayabilirsiniz.
Belirli bir zamanda bağlantının anlık durumuyla ilgilenen uygulamalar, hangi tür bir ağın kullanılabildiğini öğrenmek için ConnectivityManager
yöntemlerini çağırabilir. Bu yöntemler, hata ayıklama ve belirli bir zamandaki bağlantının anlık görüntüsünü incelemek için faydalıdır.
Ancak senkronize ConnectivityManager
yöntemleri, bir çağrıdan sonra gerçekleşen hiçbir şeyi uygulamanıza bildirmez. Bu nedenle kullanıcı arayüzünüzü güncellemenize izin vermez. Ayrıca, ağ bağlantısının kesilmesine veya ağ özelliklerinin değişmesine göre uygulama davranışını ayarlayamaz.
Bağlantı her an değişebilir. Bu nedenle, çoğu uygulamanın cihazdaki ağ bağlantısının durumunu her zaman güncel bir şekilde görmesi gerekir. Uygulamalar, önemsediği değişikliklerle ilgili uyarı almak için ConnectivityManager
ile geri çağırma işlevi kaydedebilir. Uygulamanız, geri aramayı kullanarak bağlantıdaki ilgili değişikliklere hemen tepki verebilir. Bu sayede, hızlı güncellemeleri kaçırabilecek pahalı anketlere başvurmak zorunda kalmaz.
NetworkCallback
'ü ve cihazın bağlantı durumu hakkında bilgi edinmenin diğer yollarını kullanmak için belirli bir izin gerekmez.
Ancak bazı ağlar belirli izinlere tabidir.
Örneğin, uygulamaların erişemediği kısıtlanmış ağlar olabilir. Arka plan ağına bağlanmak için CHANGE_NETWORK_STATE
izni gerekir. Bazı çağrıların çalışması için belirli izinler gerekebilir. Ayrıntılar için her çağrının özel dokümanlarına bakın.
Anlık durumu alma
Android destekli cihazlar aynı anda birçok bağlantıyı sürdürebilir.
Mevcut ağ durumu hakkında bilgi edinmek için önce ConnectivityManager
örneği elde edin:
Kotlin
val connectivityManager = getSystemService(ConnectivityManager::class.java)
Java
ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);
Ardından, uygulamanızın mevcut varsayılan ağına referans almak için bu örneği kullanın:
Kotlin
val currentNetwork = connectivityManager.getActiveNetwork()
Java
Network currentNetwork = connectivityManager.getActiveNetwork();
Uygulamanız, bir ağa referans vererek ağ hakkında bilgi isteyebilir:
Kotlin
val caps = connectivityManager.getNetworkCapabilities(currentNetwork) val linkProperties = connectivityManager.getLinkProperties(currentNetwork)
Java
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork); LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);
Daha kullanışlı işlevler için bir NetworkCallback
kaydedin.
Ağ geri çağırma işlevini kaydetme hakkında daha fazla bilgi için Ağ etkinliklerini dinleme başlıklı makaleyi inceleyin.
NetworkCapabilities ve LinkProperties
NetworkCapabilities
ve LinkProperties
nesneleri, sistemin bir ağ hakkında bildiği tüm özellikler hakkında bilgi sağlar.
LinkProperties
nesnesi; rotalar, bağlantı adresleri, arayüz adı, proxy bilgileri (varsa) ve DNS sunucuları hakkında bilgi sahibidir. İhtiyacınız olan bilgileri almak için LinkProperties
nesnesinde ilgili yöntemi çağırın.
NetworkCapabilities
nesnesi, ağ aktarımları ve bunların özellikleri hakkındaki bilgileri kapsar.
Aktarım, bir ağın çalıştığı fiziksel ortamın soyut bir temsilidir. Ethernet, kablosuz ağ ve mobil, yaygın aktarım örnekleridir.
VPN'ler ve eşler arası kablosuz ağlar da aktarım aracı olabilir.
Android'de bir ağda aynı anda birden fazla aktarım olabilir. Buna örnek olarak hem kablosuz ağlarda hem de mobil ağlarda çalışan bir VPN verilebilir. VPN'de kablosuz, mobil ve VPN aktarımları bulunur. Bir ağın belirli bir aktarıcıya sahip olup olmadığını öğrenmek için NetworkCapabilities.TRANSPORT_*
sabitlerinden biriyle NetworkCapabilities.hasTransport(int)
yöntemini kullanın.
Yetenek, ağın bir özelliğini tanımlar. Örnek özellikler arasında MMS
, NOT_METERED
ve INTERNET
yer alır. MMS özelliğine sahip bir ağ, Multimedya Mesaj Hizmeti mesajlarını gönderip alabilir. Bu özelliğe sahip olmayan ağlar ise bu mesajları gönderip alamaz. NOT_METERED
özelliğine sahip bir ağ, kullanıcıdan veri için fatura almaz. Uygulamanız, NetworkCapabilities.NET_CAPABILITY_*
sabitlerinden biriyle NetworkCapabilities.hasCapability(int)
yöntemini kullanarak uygun özellikleri kontrol edebilir.
En yararlı NET_CAPABILITY_*
sabitleri şunlardır:
NET_CAPABILITY_INTERNET
: Ağın internete erişmek için ayarlandığını gösterir. Bu, herkese açık sunuculara erişme yeteneği ile ilgili değil, kurulum ile ilgilidir. Örneğin, bir ağ internete erişecek şekilde ayarlanabilir ancak giriş portalına tabi olabilir.Operatörün mobil ağında genellikle
INTERNET
özelliği bulunur. Yerel P2P kablosuz ağlarda ise bu özellik genellikle bulunmaz. Gerçek bağlantı içinNET_CAPABILITY_VALIDATED
bölümüne bakın.NET_CAPABILITY_NOT_METERED
: Ağın sınırlı olmadığını belirtir. Kullanıcı, parasal maliyetler, veri sınırlamaları veya pil performansı sorunları nedeniyle bağlantıda yoğun veri kullanımına duyarlıysa ağ, ücretli olarak sınıflandırılır.NET_CAPABILITY_NOT_VPN
: Ağın sanal özel ağ olmadığını belirtir.NET_CAPABILITY_VALIDATED
: Ağın, tarandığında herkese açık internete gerçek erişim sağladığını gösterir. Kapalı portalın arkasındaki ağlar veya alan adı çözümlemesi sağlamayan ağlar bu özelliğe sahip değildir. Bu, sistemin gerçekten erişim sağlayan bir ağ hakkında söyleyebileceği en yakın bilgidir. Ancak doğrulanmış bir ağ, prensipte IP tabanlı filtrelemeye tabi olabilir veya zayıf sinyal gibi sorunlar nedeniyle ani bağlantı kayıpları yaşayabilir.NET_CAPABILITY_CAPTIVE_PORTAL
: Ağ tarandığında giriş portalı olduğunu gösterir.
Daha uzmanlaşmış uygulamaların ilgilenebileceği başka özellikler de vardır.
Daha fazla bilgi için NetworkCapabilities.hasCapability(int)
adresindeki parametre tanımlarını okuyun.
Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem, bir kapılı portal algıladığında kullanıcıyı giriş yapmaya davet eden bir bildirim gösterir. Bu işlem devam ederken ağda NET_CAPABILITY_INTERNET
ve NET_CAPABILITY_CAPTIVE_PORTAL
özellikleri bulunur ancak NET_CAPABILITY_VALIDATED
özelliği bulunmaz.
Kullanıcı işlem yapıp giriş portalı sayfasına giriş yaptığında cihaz herkese açık internete erişebilir hale gelir ve ağ NET_CAPABILITY_VALIDATED
özelliğini kazanır, NET_CAPABILITY_CAPTIVE_PORTAL
özelliğini kaybeder.
Benzer şekilde, bir ağın aktarımları dinamik olarak değişebilir.
Örneğin, bir VPN, temel ağı için mobil ağdan kablosuz ağa geçmek gibi yeni açılan daha hızlı bir ağı kullanacak şekilde kendini yeniden yapılandırabilir. Bu durumda ağ, TRANSPORT_CELLULAR
aktarımını kaybeder ve TRANSPORT_WIFI
aktarımını kazanır. TRANSPORT_VPN
aktarımı ise korunur.
Ağ etkinliklerini dinleme
Ağ etkinlikleri hakkında bilgi edinmek için NetworkCallback
sınıfını ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback)
ve ConnectivityManager.registerNetworkCallback(NetworkCallback)
ile birlikte kullanın. Bu iki yöntem farklı amaçlara hizmet eder.
Tüm Android uygulamalarının sistem tarafından belirlenen bir varsayılan ağı vardır. Sistem genellikle kotasız ağları kotalı ağlara, daha hızlı ağları da daha yavaş ağlara tercih eder.
Bir uygulama, HttpsURLConnection
ile ağ isteği gönderdiğinde sistem bu isteği varsayılan ağı kullanarak karşılar. Uygulamalar diğer ağlarda da trafik gönderebilir. Daha fazla bilgi için ek ağlar bölümüne bakın.
Varsayılan ağ olarak ayarlanan ağ, uygulamanın kullanım süresi boyunca herhangi bir zamanda değiştirilebilir. Buna örnek olarak, cihazın bilinen, etkin, sınırsız ve mobil ağdan daha hızlı bir kablosuz erişim noktasının kapsama alanına girmesi verilebilir. Cihaz bu erişim noktasına bağlanır ve tüm uygulamaların varsayılan ağını yeni kablosuz ağa geçirir.
Yeni bir ağ varsayılan olduğunda, uygulamanın açtığı yeni bağlantılar bu ağı kullanır. Daha sonra, önceki varsayılan ağdaki kalan tüm bağlantılar zorla sonlandırılır. Uygulamanın varsayılan ağın ne zaman değiştiğini bilmesi önemliyse varsayılan ağ geri çağırma işlevini aşağıdaki gibi kaydeder:
Kotlin
connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network : Network) { Log.e(TAG, "The default network is now: " + network) } override fun onLost(network : Network) { Log.e(TAG, "The application no longer has a default network. The last default network was " + network) } override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) { Log.e(TAG, "The default network changed capabilities: " + networkCapabilities) } override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) { Log.e(TAG, "The default network changed link properties: " + linkProperties) } })
Java
connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { Log.e(TAG, "The default network is now: " + network); } @Override public void onLost(Network network) { Log.e(TAG, "The application no longer has a default network. The last default network was " + network); } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { Log.e(TAG, "The default network changed capabilities: " + networkCapabilities); } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { Log.e(TAG, "The default network changed link properties: " + linkProperties); } });
Yeni bir ağ varsayılan olduğunda uygulama, yeni ağ için onAvailable(Network)
çağrısı alır. Bağlantıdaki değişikliklere uygun şekilde yanıt vermek için onCapabilitiesChanged(Network,NetworkCapabilities)
, onLinkPropertiesChanged(Network,LinkProperties)
veya her ikisini de uygulayın.
registerDefaultNetworkCallback()
ile kaydedilen geri aramalarda onLost()
, ağın varsayılan ağ olma durumunu kaybettiği anlamına gelir. Bağlantısı kesilmiş olabilir.
NetworkCapabilities.hasTransport(int)
parametresini sorguladığınızda varsayılan ağın kullandığı aktarım türleri hakkında bilgi edinebilirsiniz. Ancak bu, ağın bant genişliği veya ölçümlülüğü için iyi bir proxy değildir. Uygulamanız, kablosuz bağlantının her zaman sınırsız olduğunu ve her zaman mobil bağlantıdan daha iyi bant genişliği sağladığını varsayamaz.
Bunun yerine, bant genişliğini ölçmek için NetworkCapabilities.getLinkDownstreamBandwidthKbps()
ve ölçülmeyi belirlemek için NET_CAPABILITY_NOT_METERED
bağımsız değişkenleriyle birlikte NetworkCapabilites.hasCapability(int)
kullanın. Daha fazla bilgi için NetworkCapabilities ve LinkProperties ile ilgili bölüme bakın.
Varsayılan olarak geri çağırma yöntemleri, uygulamanızın bağlantı iş parçacığında çağrılır. Bu iş parçacığı, ConnectivityManager
tarafından kullanılan ayrı bir iş parçacığıdır. Geri çağırmalarınızın daha uzun süre çalışması gerekiyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler)
varyantını kullanarak bunları ayrı bir işleyici iş parçacığında çağırın.
Artık ihtiyacınız olmadığında ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
numaralı telefonu arayarak geri arama kaydınızı iptal edin.
Özellikle geri aramayı onResume()
'e kaydettiyseniz bunu yapmak için ana etkinliğinizin onPause()
bölümünden yararlanabilirsiniz.
Ek ağlar
Varsayılan ağ, çoğu uygulama için tek alakalı ağ olsa da bazı uygulamalar mevcut diğer ağlarla ilgilenebilir. Uygulamalar, bu bilgilere ulaşmak için ihtiyaçlarına uygun bir NetworkRequest
oluşturur ve ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback)
çağrısı yapar.
Bu işlem, varsayılan bir ağa dinleme işlemine benzer. Ancak, herhangi bir zamanda bir uygulama için geçerli olan tek bir varsayılan ağ olsa da bu sürüm, uygulamanızın mevcut tüm ağları aynı anda görmesine olanak tanır. Bu nedenle, onLost(Network)
çağrısı, artık varsayılan ağ olmadığı anlamına değil, ağın bağlantısının kalıcı olarak kesildiği anlamına gelir.
Uygulama, ConnectivityManager
'u dinlemek istediği ağ türleri hakkında bilgilendirmek için bir NetworkRequest
oluşturur. Aşağıdaki örnekte, yalnızca sınırsız internet bağlantılarıyla ilgilenen bir uygulama için NetworkRequest
'nin nasıl oluşturulacağı gösterilmektedir:
Kotlin
val request = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build() connectivityManager.registerNetworkCallback(request, myNetworkCallback)
Java
NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(); connectivityManager.registerNetworkCallback(request, myNetworkCallback);
Bu, uygulamanızın sistemdeki sınırsız ağlarla ilgili tüm değişikliklerden haberdar olduğu anlamına gelir.
Varsayılan ağ geri çağırma işlevine gelince, registerNetworkCallback(NetworkRequest, NetworkCallback, Handler)
işlevinin, uygulamanızın Connectivity
mesaj dizisini yüklememesi için Handler
kabul eden bir sürümü vardır.
Geri arama artık alakalı olmadığında ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
düğmesini tıklayın. Uygulamalar aynı anda birden fazla ağ geri çağırma işlevi kaydedebilir.
Kolaylık sağlamak için NetworkRequest
nesnesi, aşağıdakiler de dahil olmak üzere çoğu uygulamanın ihtiyaç duyduğu ortak özellikleri içerir:
Uygulamanızı yazarken varsayılan değerlerin kullanım alanınızla eşleşip eşleşmediğini kontrol edin ve uygulamanızın bu özelliklere sahip olmayan ağlar hakkında bilgilendirilmesini istiyorsanız varsayılan değerleri temizleyin. Öte yandan, uygulamanızın etkileşimde bulunmadığı ağlarda bağlantı değişikliği için çağrılmamak üzere özellikler ekleyin.
Örneğin, uygulamanızın MMS mesajı göndermesi gerekiyorsa MMS mesajı gönderemeyen tüm ağlar hakkında bilgi almamak için NetworkRequest
alanına NET_CAPABILITY_MMS
ekleyin. Uygulamanız yalnızca P2P kablosuz bağlantısı ile ilgileniyorsa TRANSPORT_WIFI_AWARE
ekleyin.
NET_CAPABILITY_INTERNET
ve NET_CAPABILITY_VALIDATED
, internetteki bir sunucuya veri aktarma özelliğiyle ilgileniyorsanız faydalı olacaktır.
Örnek geri çağırma sırası
Bu bölümde, mobil bağlantısı olan bir cihazda hem varsayılan geri çağırma hem de normal geri çağırma kaydeden bir uygulamanın alabileceği geri çağırma sırası açıklanmaktadır. Bu örnekte, cihaz iyi bir kablosuz erişim noktasına bağlanır ve ardından bağlantısını keser. Örnekte, cihazda Mobil veri her zaman açık ayarının etkin olduğu da varsayılmaktadır.
Zaman çizelgesi aşağıdaki gibidir:
Uygulama
registerNetworkCallback()
'ü aradığında geri arama, yalnızca mobil ağ kullanılabilir olduğu için mobil ağ içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
'den gelen aramaları hemen alır. Başka bir ağ varsa uygulama, diğer ağ için geri arama da alır.
Şekil 1.registerNetworkCallback()
numaralı telefonu aradıktan sonraki uygulama durumu.Ardından uygulama
registerDefaultNetworkCallback()
işlevini çağırır. Varsayılan ağ geri çağırma işlevi, mobil ağ varsayılan ağ olduğu için mobil ağ içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
adreslerine gelen aramaları almaya başlar. Varsayılan olmayan başka bir ağ etkinse uygulama, varsayılan olmayan ağ için arama alamaz.
Şekil 2. Varsayılan bir ağ kaydettikten sonra uygulama durumu.Daha sonra cihaz, (sınırsız) bir kablosuz ağa bağlanır. Normal ağ geri çağırma, kablosuz ağ için
onAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
adreslerine gelen aramaları alır.
Şekil 3. Sınırsız bir kablosuz ağa bağlandıktan sonra uygulama durumu.Bu noktada, kablosuz ağın doğrulanmasının biraz zaman alması mümkündür. Bu durumda, normal ağ geri çağırma için
onNetworkCapabilitiesChanged()
çağrılarıNET_CAPABILITY_VALIDATED
özelliğini içermez. Kısa bir süre sonra,onNetworkCapabilitiesChanged()
için bir çağrı alır. Bu çağrıda, yeni özellikler arasındaNET_CAPABILITY_VALIDATED
da yer alır. Çoğu durumda doğrulama işlemi çok hızlıdır.Kablosuz ağ doğrulandığında sistem, özellikle de kotasız olduğu için mobil ağa tercih edilir. Kablosuz ağ varsayılan ağ haline gelir. Bu nedenle, varsayılan ağ geri çağırma işlevi, kablosuz ağ için
onAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
adresine bir çağrı alır. Mobil ağ arka plana gider ve normal ağ geri araması, mobil ağ içinonLosing()
adresine bir arama alır.Bu örnekte, bu cihazda mobil verilerin her zaman açık olduğu varsayıldığı için mobil ağ bağlantısı hiçbir zaman kesilmez. Ayar kapalıysa bir süre sonra mobil ağ bağlantısı kesilir ve normal ağ geri araması
onLost()
adresine bir arama alır.
Şekil 4. Kablosuz ağ doğrulandıktan sonra uygulama durumu.Daha sonra, cihaz kapsama alanından çıktığı için kablosuz bağlantısı aniden kesilir. Kablosuz bağlantısı kesildiğinde, normal ağ geri çağırma işlevi kablosuz bağlantı için
onLost()
'e çağrı alır. Mobil yeni varsayılan ağ olduğundan varsayılan ağ geri araması, mobil ağ içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
numaralarına gelen aramaları alır.
Şekil 5. Kablosuz ağ bağlantısı kesildikten sonra uygulama durumu.
Mobil veri her zaman açık ayarı kapalıysa kablosuz bağlantı kesildiğinde cihaz mobil ağa yeniden bağlanmaya çalışır. Resim benzerdir ancak onAvailable()
aramaları için kısa bir ek gecikme vardır ve normal ağ geri araması, mobil kullanılabilir hale geldiği için onAvailable()
, onNetworkCapabilitiesChanged()
ve onLinkPropertiesChanged()
aramalarını da alır.
Veri aktarımı için ağın kullanımıyla ilgili kısıtlamalar
Ağ geri çağırması olan bir ağı görebilmeniz, uygulamanızın veri aktarımı için ağı kullanabileceği anlamına gelmez. Bazı ağlar internet bağlantısı sağlamaz ve bazı ağlar ayrıcalıklı uygulamalarla kısıtlanmış olabilir. İnternet bağlantısını kontrol etmek için NET_CAPABILITY_INTERNET
ve NET_CAPABILITY_VALIDATED
başlıklı makalelere bakın.
Arka plan ağlarının kullanımı da izin denetimlerine tabidir. Uygulamanız arka planda ağ kullanmak istiyorsa CHANGE_NETWORK_STATE
iznine sahip olmalıdır.
Bu izne sahip uygulamalar, cihaz bir kablosuz ağa bağlıyken sistemin kapalı bir ağı (ör. mobil ağ) etkinleştirmeye çalışmasını sağlar. Bu tür bir uygulama, ağ açıldığında aranacak bir NetworkCallback
ile ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback)
çağırır.