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, ağın özellikleri (kablosuz, mobil, Bluetooth) ve ağın yapabilecekleri gibi bilgiler içerir. Örneğin, ağın MMS gönderip gönderemediğini, doğrulama amacıyla yönlendirme yapan bir portalın arkasında olup olmadığını veya ölçülü 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 eşzamanlı ConnectivityManager
yöntemleri, bir görüşmeden sonra olan hiçbir şey hakkında uygulamanıza bilgi vermediğinden 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, ilgilendikleri 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ı aramaların çalışması için de 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
öğesinin bir ö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ğla ilgili 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ğırmalarını kaydetme hakkında daha fazla bilgi için Ağ etkinliklerini dinleme konusuna bakın.
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. Taşıma için yaygın örnekler ethernet, kablosuz ve mobildir.
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, kurulum ile ilgilidir; herkese açık sunuculara erişimin gerçek kabiliyeti değildir. Ö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 söz konusu bağlantıda yoğun veri kullanımına karşı hassas olan ağlar sayaçlı 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. Giriş portalının arkasındaki ağlarda veya alan adı çözümü sunmayan ağlarda bu özellik bulunmaz. 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)
sayfasındaki parametre tanımlarını okuyun.
Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem, doğrulama amacıyla yönlendirme yapan bir 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, 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ırken TRANSPORT_VPN
aktarımını 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 varsayılan bir ağı vardır. Bu ağ, sistem tarafından belirlenir. Sistem genellikle kotasız ağları kotalı ağlara, daha hızlı ağları ise 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. Bir noktada, önceki varsayılan ağda 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 aşağıdaki gibi bir varsayılan ağ geri çağırma işlevi 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ı değişikliklerine uygun şekilde tepki vermek için onCapabilitiesChanged(Network,NetworkCapabilities)
, onLinkPropertiesChanged(Network,LinkProperties)
veya her ikisini birden 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.
NetworkCapabilities.hasTransport(int)
sorgusunu sorgulayarak varsayılan ağın kullandığı aktarımlar hakkında bilgi edinebilirsiniz. Ancak bu, ağın bant genişliği veya sayaçlığı açısından zayıf bir proxy'dir. 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ğırma uygulamanızın artık çalışması gerekiyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler)
varyantını kullanarak bunları ayrı bir çalışan iş parçacığında çağırın.
Artık kullanmayacaksanız ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
numaralı telefonu arayarak geri aramanızın kaydını 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)
numaralı telefonu arayı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 mesajları göndermesi gerekiyorsa MMS mesajı gönderemeyen tüm ağların bildirilmesini önlemek için NetworkRequest
öğesine 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 sunucuyla veri aktarabilmek istiyorsanız kullanışlıdı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, daha sonra 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()
çağırdığında, yalnızca bu ağın kullanılabilir durumda olduğu için geri çağırma işlemi mobil şebeke içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
adlı operatörlerden gelen aramaları anında alır. Başka bir ağ varsa uygulama diğer ağ için de geri çağırma alır.
Şekil 1.registerNetworkCallback()
arandıktan sonra uygulama durumu.Ardından uygulama
registerDefaultNetworkCallback()
işlevini çağırır. Mobil ağ varsayılan ağ olduğundan, varsayılan ağ geri çağırması mobil şebeke içinonAvailable()
,onNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
numaralı telefona 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()
adresine 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 geçer ve normal ağ geri çağırması mobil ağ içinonLosing()
arasına bir çağrı alır.Bu örnekte, mobil verinin bu cihaz için her zaman açık olduğu varsayıldığından mobil ağın 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ını aniden keser. Kablosuz bağlantısı kesildiğinde, normal ağ geri çağırma işlevi kablosuz bağlantı için
onLost()
adresine bir ç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 veriyi 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ği için normal ağ geri araması, 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 kontrollerine 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.