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
sistemin bağlantı durumu hakkında uygulamanızı bilgilendirir.Network
sınıfı, cihazın bağlı olduğu ağlardan birini temsil eder. Ağ hakkında bilgi toplamak içinNetwork
object öğesini anahtar olarak kullanabilir veya ağdaki soketleri bağlayabilirsiniz.ConnectivityManager
Ağ bağlantısı kesildiğindeNetwork
nesnesi kullanılamaz. Cihaz daha sonra aynı cihaza yeniden bağlansa bile yeni birNetwork
nesnesi yeni ağı temsil eder.LinkProperties
nesnesi, bir ağın bağlantısı hakkında bilgiler içerir. Örneğin, DNS sunucularının listesi, yerel IP adresleri ve ağ için yüklenen ağ rotaları.NetworkCapabilities
nesnesi, bir ağın özellikleri (ör. aktarımlar (kablosuz, mobil, Bluetooth) ve ağın yapabilecekleri) hakkında bilgiler içerir. Örneğin, ağın MMS gönderebiliyor mu, giriş portalı arkasında mı yoksa ücretli mi olduğunu belirlemek için nesneyi sorgulayabilirsiniz.
Herhangi bir zamanda bağlantının anlık durumuyla ilgilenen uygulamalar, hangi tür ağın kullanılabildiğini öğrenmek için ConnectivityManager
yöntemlerini çağırabilir. Bu yöntemler, hata ayıklama ve herhangi bir zamanda kullanılabilen bağlantının anlık görüntüsünü ara sıra incelemek için faydalıdır.
Ancak senkronize ConnectivityManager
yöntemleri, uygulamanıza bir çağrıdan sonra olan hiçbir şeyi bildirmez. Bu nedenle, kullanıcı arayüzünüzü güncellemenize izin vermezler. Ayrıca, ağ bağlantısı kesildiğinde veya ağ özellikleri değiştiğinde uygulama davranışını ayarlayamazlar.
Bağlantı durumu istediğiniz zaman değişebilir ve çoğu uygulamanın cihazdaki ağ durumunun her zaman güncel bir görünümüne sahip olması gerekir. Uygulamalar, ConnectivityManager
ile geri çağırma kaydı oluşturarak uygulamayı ilgilendiren değişiklikler konusunda uyarı alabilir. Geri çağırma işlevini kullanarak uygulamanız, bağlantıdaki ilgili değişikliklere pahalı ve hızlı güncellemeleri kaçırabilecek yoklama yöntemlerine başvurmak zorunda kalmadan anında tepki verebilir.
NetworkCallback
ve cihazın bağlantı durumu hakkında bilgi edinmenin diğer yollarını kullanmak için herhangi bir özel izin gerekmez.
Ancak bazı ağlar belirli izinlere tabidir.
Örneğin, uygulamaların kullanamadığı kısıtlanmış ağlar olabilir. Arka plan ağına bağlanmak için CHANGE_NETWORK_STATE
izni gerekir. Ayrıca bazı aramaların çalışması için belirli izinler gerekebilir. Ayrıntılar için her aramanın dokümanına bakın.
Anlık durum alma
Android destekli bir cihaz aynı anda birçok bağlantıyı koruyabilir.
Mevcut ağ durumu hakkında bilgi edinmek için önce ConnectivityManager
örneğini alın:
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 fazla işlevden yararlanmak için NetworkCallback
kaydettirin.
Ağ geri aramalarını 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
Nesne; 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ında bilgi içerir.
Taşıma, bir ağın üzerinde çalıştığı fiziksel ortamın soyutlanmasıdır. Taşıma katmanlarına yaygın örnekler arasında Ethernet, kablosuz ve mobil ağlar yer alır.
VPN'ler ve eşler arası kablosuz ağlar da aktarım için kullanılabilir.
Android'de bir ağ aynı anda birden fazla aktarıma sahip olabilir. Buna örnek olarak hem kablosuz 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ıma sahip olup olmadığını öğrenmek için NetworkCapabilities.TRANSPORT_*
sabitlerinden biriyle NetworkCapabilities.hasTransport(int)
yöntemini kullanın.
Bir özellik, 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 Mesajlaşma Hizmeti iletileri gönderebilir ve alabilir. Bu özelliğe sahip olmayan bir ağ ise bunu yapamaz. NOT_METERED
özelliğine sahip bir ağ, kullanıcıdan veri için ödeme 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 ayarlanmış olduğunu gösterir. Bu, herkese açık sunuculara ulaşma yeteneği değil, kurulum ile ilgilidir. Örneğin, bir ağ internete erişecek şekilde ayarlanabilir ancak giriş portalına tabi olabilir.Bir operatörün mobil ağında genellikle
INTERNET
özelliği bulunur. Yerel P2P kablosuz ağında ise bu özellik genellikle bulunmaz. Gerçek bağlantı içinNET_CAPABILITY_VALIDATED
konusuna bakın.NET_CAPABILITY_NOT_METERED
: Ağın ölçülü olmadığını gösterir. Kullanıcı, parasal maliyetler, veri sınırlamaları veya pil performansıyla ilgili sorunlar nedeniyle bu bağlantıda yoğun veri kullanımına karşı hassassa ağ, ölçülü olarak sınıflandırılır.NET_CAPABILITY_NOT_VPN
: Ağın sanal özel ağ olmadığını gösterir.NET_CAPABILITY_VALIDATED
: Ağın, incelendiğinde herkese açık internete gerçek erişim sağladığını gösterir. Bir captive portal'ın arkasındaki ağ veya alan adı çözümlemesi sağlamayan bir ağ bu özelliğe sahip değildir. Bu, sistemin erişim sağlayan bir ağ hakkında söyleyebileceği en yakın bilgidir. Bununla birlikte, doğrulanmış bir ağ da prensipte IP tabanlı filtrelemeye tabi olabilir veya zayıf sinyal gibi sorunlar nedeniyle bağlantıda ani kayıplar yaşayabilir.NET_CAPABILITY_CAPTIVE_PORTAL
: Ağ incelendiğinde 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)
bölümündeki parametre tanımlarını inceleyin.
Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem bir giriş portalı algıladığında kullanıcıyı oturum açmaya 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 hâle gelir ve ağ NET_CAPABILITY_VALIDATED
özelliğini kazanıp NET_CAPABILITY_CAPTIVE_PORTAL
özelliğini kaybeder.
Aynı şekilde, bir ağın aktarımları da dinamik olarak değişebilir.
Örneğin, bir VPN, yeni ortaya çıkan daha hızlı bir ağı kullanmak için kendini yeniden yapılandırabilir. Örneğin, temel ağı için mobil ağdan kablosuz ağa geçebilir. Bu durumda ağ, TRANSPORT_CELLULAR
iletimini kaybeder ve TRANSPORT_WIFI
iletimini kazanırken TRANSPORT_VPN
iletimini korur.
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 varsayılan bir ağı vardır. Sistem genellikle ölçülmemiş ağları ölçülmüş ağlara, daha hızlı ağları ise daha yavaş ağlara tercih eder.
Bir uygulama, HttpsURLConnection
ile olduğu gibi bir ağ isteği gönderdiğinde sistem, bu isteği varsayılan ağı kullanarak karşılar. Uygulamalar diğer ağlara da trafik gönderebilir. Daha fazla bilgi için ek ağlar hakkındaki bölüme bakın.
Varsayılan ağ olarak ayarlanan ağ, bir uygulamanın kullanım ömrü boyunca herhangi bir zamanda değişebilir. Tipik bir örnek, cihazın bilinen, etkin, ölçülmemiş ve mobil ağdan daha hızlı bir kablosuz erişim noktasının menziline girmesidir. 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 hale geldiğinde, uygulamanın açtığı tüm yeni bağlantılar bu ağı kullanır. Bir süre sonra, önceki varsayılan ağdaki 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ğırmasını 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 hale geldiğinde 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 bir geri arama için onLost()
ağın varsayılan ağ olma durumunu kaybettiği anlamına gelir. Bağlantısı kesilmiş olabilir.
Varsayılan ağın kullandığı aktarımlar hakkında NetworkCapabilities.hasTransport(int)
sorgusu yaparak bilgi edinebilirsiniz ancak bu, ağın bant genişliği veya ölçülülüğü için uygun bir proxy değildir. Uygulamanız, kablosuz bağlantının her zaman sınırsız ve 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()
, ücretli olup olmadığını belirlemek için de NetworkCapabilites.hasCapability(int)
ile NET_CAPABILITY_NOT_METERED
bağımsız değişkenlerini kullanın. Daha fazla bilgi için NetworkCapabilities ve LinkProperties bölümüne 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ğırma işlevlerinin uygulanması daha uzun bir çalışma gerektiriyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler)
varyantını kullanarak bunları ayrı bir çalışan iş parçacığında çağırın.
Artık kullanmadığınızda geri aramayı ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
numaralı telefonu arayarak iptal edin.
Bunu yapmak için ana etkinliğinizin onPause()
bölümü iyi bir yerdir. Özellikle geri çağırmayı onResume()
içinde kaydederseniz.
Ek ağlar (gelişmiş kullanım alanları)
Varsayılan ağ çoğu uygulama için tek alakalı ağ olsa da bazı uygulamalar diğer kullanılabilir ağlarla ilgilenebilir. Bu uygulamalar hakkında bilgi edinmek için ihtiyaçlarınıza uygun bir NetworkRequest
oluşturun ve ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback)
numaralı telefonu arayın.
Bu işlem, varsayılan bir ağı dinlemeye benzer. Ancak herhangi bir zamanda bir uygulamaya yalnızca bir varsayılan ağ uygulanabilirken bu sürüm, uygulamanızın tüm kullanılabilir ağları aynı anda görmesine olanak tanır. Bu nedenle, onLost(Network)
çağrısı, ağın artık varsayılan olmadığı anlamına gelmez. Ağın bağlantısının kalıcı olarak kesildiği anlamına gelir.
Uygulama, NetworkRequest
oluşturarak ConnectivityManager
'a hangi tür ağları dinlemek istediğini bildirir. Aşağıdaki örnekte, yalnızca sınırsız internet bağlantılarıyla ilgilenen bir uygulama için NetworkRequest
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ğırmasıyla ilgili olarak, registerNetworkCallback(NetworkRequest, NetworkCallback, Handler)
'ın Handler
kabul eden bir sürümü vardır. Bu sürüm, uygulamanızın Connectivity
iş parçacığını yüklemez.
Geri arama artık alakalı olmadığında
ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
seçeneğini belirleyin. Bir uygulama, aynı anda birden fazla ağ geri çağırması kaydedebilir.
Kolaylık sağlamak için NetworkRequest
nesnesi, çoğu uygulamanın ihtiyaç duyduğu ortak özellikleri (ör. aşağıdakiler) içerir:
Uygulamanızı yazarken varsayılan ayarları kontrol ederek kullanım alanınıza uygun olup olmadıklarını görün ve uygulamanızın bu özelliklere sahip olmayan ağlar hakkında bildirim almasını istiyorsanız bu ayarları temizleyin. Diğer yandan, uygulamanızın etkileşimde bulunmadığı ağlardaki bağlantı değişiklikleri için çağrılmamak üzere özellikler ekleyin.
Örneğin, uygulamanızın MMS mesajları göndermesi gerekiyorsa MMS mesajları gönderemeyen tüm ağlar hakkında bilgi verilmesini önlemek için NetworkRequest
öğesine NET_CAPABILITY_MMS
ekleyin. Uygulamanız yalnızca P2P kablosuz bağlantıyla ilgileniyorsa
TRANSPORT_WIFI_AWARE
ekleyin.
NET_CAPABILITY_INTERNET
ve
NET_CAPABILITY_VALIDATED
internet üzerindeki bir sunucuyla veri aktarma özelliğiyle ilgileniyorsanız faydalı olur.
Örnek geri arama sırası
Bu bölümde, mobil bağlantısı olan bir cihaza 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ıyor ve ardından bağlantısı kesiliyor. Örnekte, cihazda Mobil veri her zaman açık ayarının etkin olduğu da varsayılmaktadır.
Zaman çizelgesi şu şekildedir:
Uygulama
registerNetworkCallback()
işlevini çağırdığında geri çağırma işlevi, yalnızca bu ağ kullanılabilir olduğundan mobil ağ içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
işlevlerinden gelen çağrıları hemen alır. Başka bir ağ varsa uygulama, diğer ağ için de geri çağırma alır.
1. Şekil.registerNetworkCallback()
numaralı telefonu aradıktan sonraki uygulama durumu.Ardından uygulama
registerDefaultNetworkCallback()
'yı arar. Varsayılan ağ geri araması, mobil ağ varsayılan ağ olduğu için mobil ağdaonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
numaralarına yapılan aramaları almaya başlar. Başka bir ağ (varsayılan olmayan) etkinse uygulama, varsayılan olmayan ağ için çağrı alamaz.
Şekil 2. Varsayılan bir ağ kaydedildikten sonraki uygulama durumu.Daha sonra cihaz, (ölçülmeyen) bir kablosuz ağa bağlanır. Normal ağ geri araması, kablosuz ağ için
onAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
numaralarına gelen aramaları alır.
3.Şekil Sınırsız kablosuz ağa bağlandıktan sonraki uygulama durumu.Bu noktada, kablosuz ağın doğrulanması biraz zaman alabilir. Bu durumda,
onNetworkCapabilitiesChanged()
normal ağ geri çağırma işlemleri için yapılan çağrılarNET_CAPABILITY_VALIDATED
özelliğini içermez. Kısa bir süre sonraonNetworkCapabilitiesChanged()
numaralı telefondan arama alır. Bu telefondaNET_CAPABILITY_VALIDATED
gibi yeni özellikler vardır. Çoğu durumda doğrulama işlemi çok hızlıdır.Wi-Fi ağı doğrulandığında sistem, genellikle sınırsız olduğu için mobil ağ yerine bu ağı tercih eder. Kablosuz ağ varsayılan ağ haline gelir. Bu nedenle, varsayılan ağ geri araması, kablosuz ağ için
onAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
'ye yapılan bir çağrı alır. Mobil ağ arka plana gider ve normal ağ geri araması, mobil ağ içinonLosing()
numarasına yapılan bir aramayı alır.Bu örnekte, mobil verilerin bu cihazda her zaman açık olduğu varsayıldığından mobil ağın bağlantısı hiçbir zaman kesilmez. Ayarı devre dışı bırakırsanız bir süre sonra mobil ağın bağlantısı kesilir ve normal ağ geri araması
onLost()
numarasına çağrı alır.
4. şekil. Kablosuz ağ doğrulandıktan sonraki uygulama durumu.Daha sonra cihaz, menzil dışına çıktığı için kablosuz bağlantısı aniden kesiliyor. Kablosuz bağlantısı kesildiğinden normal ağ geri araması, kablosuz için
onLost()
numarasına yapılan bir arama alır. Mobil, yeni varsayılan ağ olduğundan, varsayılan ağ geri araması, mobil ağ içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
numaralarına yapılan aramaları alır.
5. şekil. Kablosuz ağ bağlantısı kesildikten sonraki 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 mobil kullanılabilir hale geldiğinden normal ağ geri araması da onAvailable()
, onNetworkCapabilitiesChanged()
ve onLinkPropertiesChanged()
aramalarını alır.
Ağın veri aktarımı için kullanımına ilişkin kısıtlamalar
Ağ geri araması olan bir ağı görebilmek, uygulamanızın veri aktarımı için bu ağı kullanabileceği anlamına gelmez. Bazı ağlar internet bağlantısı sağlamaz ve bazı ağlar ayrıcalıklı uygulamalarla sınırlı 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 kontrollerine tabidir. Uygulamanızın arka plan ağı kullanmak istemesi durumunda CHANGE_NETWORK_STATE
izni gerekir.
Bu izne sahip uygulamalar, cihaz bir kablosuz ağa bağlıyken sistemin mobil ağ gibi çalışmayan bir ağı başlatmayı denemesine olanak tanır. Bu tür bir uygulama, ağ başlatıldığında aranacak bir ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback)
NetworkCallback
'ı çağırır.