Android, uygulamaların bağlantıdaki dinamik değişiklikleri öğrenmesini sağlar. Şunu kullanın: bağlantı değişikliklerini izlemek ve bunlara yanıt vermek için aşağıdaki sınıfları inceleyin:
ConnectivityManager
uygulamanıza sistemdeki bağlantı durumunu bildirir.Network
sınıfı cihazın bağlı olduğu ağlar.Network
kullanabilirsiniz kullanarak ağ hakkında bilgi toplamak için bir anahtar olarakConnectivityManager
veya ağdaki yuvaları bağlamayı deneyin. Ağ bağlantısı kesilirseNetwork
nesnesi kullanılamaz. Hatta cihazı daha sonra yeniden bağlanıldığında, yeni birNetwork
nesnesi yeni bir ağ.LinkProperties
nesnesi ağ bağlantısı hakkında, DNS listesi gibi bilgileri içerir Sunucular, yerel IP adresleri ve ağ için yüklü ağ rotaları.NetworkCapabilities
nesne, bir ağın özellikleri hakkında bilgi içerir. Örneğin özellikleri (kablosuz, mobil, Bluetooth) ve ağın kapasitesini içerir. Örneğin, ağın bir doğrulama portalının arkasında olan ya da ölçüm yapılan
Herhangi bir zamanda bağlantının anlık durumuyla ilgilenen uygulamalar
Nasıl bir ağın olduğunu öğrenmek için ConnectivityManager
yöntemlerini çağırın
kullanılabilir. Bu yöntemler, hata ayıklama konusunda ve ara sıra sitenizin
anlık görüntü gösterilir.
Ancak eşzamanlı
ConnectivityManager
yöntemleri, uygulamanıza olan hiçbir şey hakkında bilgi vermez
Bu sayede kullanıcı arayüzünüzü güncellemenize izin vermezler. Ayrıca, bu reklamlar uygulamayı
veya bağlantı özellikleri, ağın bağlantısının kesilmesine veya
unutmayın.
Bağlantı her zaman değişebilir ve çoğu uygulamanın
cihazdaki ağ durumunun her zaman güncel ve güncel bir görünümünü sunar. Uygulamalar şunları yapabilir:
ConnectivityManager
önem verir. Geri çağırma işleviyle uygulamanız,
Pahalı anketlere gerek kalmadan bağlantıda önemli bir değişiklik
hızlı güncellemeleri kaçırabilir.
NetworkCallback
ve platform hakkında bilgi edinmek için diğer
bağlantı durumu özel bir izin gerektirmez.
Ancak bazı ağlar belirli izinlere tabidir.
Örneğin,
Örneğin, uygulamaların kullanamadığı kısıtlanmış ağlar olabilir. Bir
arka plan ağında CHANGE_NETWORK_STATE
izni gerekiyor. Biraz da
çağrılarının çalışması için belirli izinler gerekebilir. Daha fazla bilgi için
daha ayrıntılı bilgi edinmek için
her telefon görüşmesinin dokümanlarına bakın.
Anlık durum bilgisi al
Android destekli bir cihaz, aynı anda birçok bağlantıyı koruyabilir.
Mevcut ağ durumu hakkında bilgi almak için önce
ConnectivityManager
örneği:
Kotlin
val connectivityManager = getSystemService(ConnectivityManager::class.java)
Java
ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);
Sonra, bu örneği kullanarak şunun için mevcut varsayılan ağa bir referans alın: uygulama:
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 faydalı işlevler için bir
NetworkCallback
.
Ağ geri çağırmalarını kaydetme hakkında daha fazla bilgi için bkz.
Ağ etkinliklerini dinleyin.
NetworkCapabilities ve LinkProperties
NetworkCapabilities
ve LinkProperties
nesneleri, size
sistemin bir ağ hakkında bildiği tüm özellikleri içerir.
LinkProperties
nesne rotaları, bağlantı adreslerini, arayüz adını, proxy bilgilerini (varsa)
herhangi biri) ve DNS sunucuları. LinkProperties
nesnesinde ilgili yöntemi çağırın
ve ihtiyacınız olan bilgileri alın.
NetworkCapabilities
nesnesi
ağ aktarımları ve bunların yetenekleri ile ilgili bilgileri içerir.
Taşıma, bir ağın üzerinden geçtiği fiziksel bir aracının soyutlanmasıdır.
çalışır. Taşıma için yaygın örnekler ethernet, kablosuz ve mobildir.
VPN'ler ve eşler arası kablosuz ağlar da aktarım olarak kullanılabilir.
Android'de, bir ağda aynı anda birden fazla aktarım olabilir. Örnek
Hem kablosuz hem de mobil ağlar üzerinden çalışan bir VPN. VPN
Kablosuz, mobil ve VPN aktarımları. Bunu öğrenerek
ağın belirli bir aktarımı varsa
NetworkCapabilities.hasTransport(int)
yöntemini NetworkCapabilities.TRANSPORT_*
sabitlerinden biriyle değiştirin.
Yetenek, ağın bir özelliğini tanımlar. Özelliklere örnek olarak şunlar verilebilir:
MMS
, NOT_METERED
ve INTERNET
. MMS özellikli bir ağ,
Multimedya Mesaj Hizmeti mesajları alırsınız ve bu mesaj olmadan bir ağ
yapamayız. NOT_METERED
özelliğine sahip bir ağ,
veriler için de geçerli. Uygulamanız
NetworkCapabilities.hasCapability(int)
yöntemini NetworkCapabilities.NET_CAPABILITY_*
sabitlerinden biriyle değiştirin.
En kullanışlı NET_CAPABILITY_*
sabitleri şunları içerir:
NET_CAPABILITY_INTERNET
: ağın kurulu olduğunu gösterir. internete erişmek için. Bu, kurulum ile ilgilidir ve gerçek değildir herkese açık sunuculara ulaşabilme. Örneğin bir ağ, Ancak doğrulama amacıyla yönlendirme yapan bir portala tabi tutulurlar.Bir operatörün mobil ağı genellikle
INTERNET
özelliğine sahiptir. yerel P2P kablosuz ağı genellikle çalışmaz. Gerçek bağlantı için bkz.NET_CAPABILITY_VALIDATED
NET_CAPABILITY_NOT_METERED
: ağın sayaçlı olmadığını gösterir. Ağ, Kullanıcı yoğun veri kullanımına karşı duyarlı olduğunda sınırlı olarak sınıflandırılır. bağlantı maliyetleri, veri sınırlamaları veya pil performansı sorunları.NET_CAPABILITY_NOT_VPN
: , ağın sanal bir özel ağ olmadığını belirtir.NET_CAPABILITY_VALIDATED
: ağın gerçek erişim sağladığını belirtir internette herkese açık olarak gönderilir. Bir mahkumun arkasında duran ağ veya alan adı çözümü sağlamayan bir ağda olanak tanıyor. Bu, sistemin bir ağ hakkında yapabileceği en yakın bilgidir gerçek erişim sağlamaktadır. Doğrulanmış bir ağ bunu yapabilmeye rağmen IP tabanlı filtrelemeye tabi tutulacağından veya IP adresinde zayıf sinyal gibi sorunlar nedeniyle bağlantı kurulmasını engeller.NET_CAPABILITY_CAPTIVE_PORTAL
: kontrol edildiğinde ağın doğrulama portalı olduğunu gösterir.
Daha özel uygulamaların ilgilenebileceği başka özellikler de vardır.
Daha fazla bilgi için şu adresteki parametre tanımlarını okuyun:
NetworkCapabilities.hasCapability(int)
.
Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem bir veya daha fazla
giriş portalında, kullanıcıyı giriş yapmaya davet eden bir bildirim gösterilir. Bu
devam ediyorsa ağda NET_CAPABILITY_INTERNET
ve
NET_CAPABILITY_CAPTIVE_PORTAL
özellikleri, ancak şu değil:
NET_CAPABILITY_VALIDATED
özelliği.
Kullanıcı bir işlem yapıp giriş yaptığında
giriş portalı sayfasında, cihaz, herkese açık internete erişebilir
Ağ, NET_CAPABILITY_VALIDATED
özelliğini edinir ve
NET_CAPABILITY_CAPTIVE_PORTAL
özelliği.
Benzer şekilde, ağın aktarımları dinamik olarak değişebilir.
Örneğin, bir VPN kendini yeniden yapılandırarak
Örneğin mobil cihazlardan kablosuz ağa geçiş gibi
bağlı olur. Bu durumda, ağ TRANSPORT_CELLULAR
bağlantısını kaybeder
TRANSPORT_WIFI
taşımasını edinir ve
TRANSPORT_VPN
toplu taşıma.
Ağ etkinliklerini dinleme
Ağ etkinlikleri hakkında bilgi edinmek için
NetworkCallback
ve
ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback)
ve
ConnectivityManager.registerNetworkCallback(NetworkCallback)
. Bu iki yöntem farklı
amaçlar.
Tüm Android uygulamalarının varsayılan bir ağı vardır. Bu ağ, sistem tarafından belirlenir. Sistem genellikle sınırsız ağları sayaçlı ve hızlı ağları da yavaşlatır.
Uygulama, aşağıdaki gibi bir ağ isteği gönderdiğinde:
HttpsURLConnection
,
sistem bu isteği varsayılan ağı kullanarak karşılar. Uygulamalar trafik gönderebilir
diğer ağlarda da çalışır. Daha fazla bilgi için
ağlar.
Varsayılan ağ olarak ayarlanan ağ, bu süre boyunca herhangi bir zamanda süresi vardır. Buna tipik bir örnek olarak, bilinen, aktif, sınırsız ve mobilden daha hızlı kablosuz erişim noktası İlgili içeriği oluşturmak için kullanılan cihaz bu erişim noktasına bağlanır ve tüm cihazlar için varsayılan ağı değiştirir uygulamanızı yeni kablosuz ağa taşımanızı sağlar.
Yeni bir ağ varsayılan hâline geldiğinde, uygulamanın açtığı her yeni bağlantı bu ağ. Bir noktada, önceki bağlantıda kalan tüm bağlantılar varsayılan ağların zorla sonlandırılması. Uygulamanın kullanıcılar tarafından Varsayılan ağ değiştiğinde bunu bilir ve varsayılan bir ağ kaydeder şu şekilde geri çağırmanız gerekir:
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 hâline geldiğinde, uygulama
onAvailable(Network)
yeni bir ağ için. Uygulama
onCapabilitiesChanged(Network,NetworkCapabilities)
onLinkPropertiesChanged(Network,LinkProperties)
,
veya ikisini birden kullanabilirsiniz.
registerDefaultNetworkCallback()
ile kaydedilen 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 bilgi edinmek için
sorgulama
NetworkCapabilities.hasTransport(int)
bu, ağın bant genişliği veya sayaçlığı için zayıf bir proxy'dir. Uygulamanız
kablosuz ağın her zaman sınırsız olduğunu ve her zaman daha iyi bant genişliği sağladığını varsayamayız
daha fazla ilgi görüyor.
Bunun yerine
NetworkCapabilities.getLinkDownstreamBandwidthKbps()
bant genişliğini ölçüyorlar.
NetworkCapabilites.hasCapability(int)
şununla:
NET_CAPABILITY_NOT_METERED
bağımsız değişkenleri kullanır. Daha fazla bilgi için
NetworkCapabilities ve LinkProperties (NetworkCapabilities ve LinkProperties).
Varsayılan olarak geri çağırma yöntemleri,
Bu ileti dizisi, ConnectivityManager
tarafından kullanılan ayrı bir ileti dizisidir. Eğer
geri çağırmanın başka bir işlem yapması gerekmez. Bunları
varyantı kullanarak çalışan iş parçacığını ayırın
ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler)
.
Artık kullanmayacaksanız geri çağırmanızın kaydını silmek için şu numarayı arayın:
ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
.
Ana etkinliğinize ait onPause()
özellikle geri çağırmayı
onResume()
.
Ek ağlar
Varsayılan ağ, çoğu uygulama için alakalı tek ağ olsa da bazı uygulamalar
uygulamalar
diğer ağlarla ilgilenebilirler. Uygulamalar bunları öğrenmek için
kendilerine uygun bir NetworkRequest
ihtiyaç duyacağınız
ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback)
.
Süreç, dinleme ile benzerdir.
varsayılan bir ağa bağlayın. Ancak her ne kadar
herhangi bir zamanda uygulama için geçerli olan varsayılan ağda yer alıyorsa bu sürüm,
kullanılabilir tüm ağları aynı anda görebileceğinden
onLost(Network)
ağın bağlantısının tamamen kesildiği anlamına gelir. Bu, varsayılan olmamasıdır
artık geçerli.
Uygulama, ConnectivityManager
adlı kullanıcıyı hangi tür veriler hakkında bilgilendirmek için bir NetworkRequest
oluşturur
dinlemek istediği ağın türü. Aşağıdaki örnekte, Arkadaş Bitkiler projesinin
Yalnızca sınırsız internet ile ilgilenen bir uygulama için NetworkRequest
bağlantılar:
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 ölçüm yapılmayan cihazlarla ilgili tüm değişiklikleri haberdar edeceği anlamına gelir yapılandırdığınızdan emin olun.
Varsayılan ağ geri çağırması için
registerNetworkCallback(NetworkRequest, NetworkCallback, Handler)
bir Handler
kabul eden ve dolayısıyla Connectivity
ileti dizisini yüklemez.
uygulamasını indirin.
Telefonla arama
ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
geri arama artık alakasız olduğunda. Bir uygulama eş zamanlı olarak kaydedilebilir
birden çok ağ geri çağırması olabilir.
Kolaylık sağlaması açısından
NetworkRequest
nesnesi
çoğu uygulamanın ihtiyaç duyduğu ortak özellikleri aşağıda bulabilirsiniz:
Uygulamanızı yazarken varsayılan değerleri kontrol ederek kullanın ve uygulamanızın ağlar hakkında bilgilendirilmesini istiyorsanız bunları temizleyin bu özelliklere sahip değildir. Diğer yandan, diğer ağlardaki herhangi bir bağlantı değişikliğinde çağrılmamasını öğrenmesi lazım.
Örneğin, uygulamanızın MMS mesajları göndermesi gerekiyorsa
NET_CAPABILITY_MMS
bağlanamayan tüm ağlar hakkında bilgilendirilmemesi için NetworkRequest
MMS mesajları gönderme. Ekle
TRANSPORT_WIFI_AWARE
Uygulamanız yalnızca P2P kablosuz bağlantıyla ilgileniyorsanız.
NET_CAPABILITY_INTERNET
ve
NET_CAPABILITY_VALIDATED
Verileri bir sunucuyla aktarabilmek istiyorsanız
internette geziniyor.
Örnek geri çağırma sırası
Bu bölümde, hem varsayılan bir geri çağırma hem de bir normal geri çağırma kaydeder. mobil bağlantıya sahip. Bu örnekte, cihaz bir iyi bir kablosuz erişim noktası vardır, daha sonra bağlantıyla bağlantısını keser. Örnekte aynı zamanda Cihazın Mobil veri her zaman açık ayarı etkinleştirilmiştir.
Zaman çizelgesi aşağıdaki gibidir:
Uygulama
registerNetworkCallback()
numarasını aradığında hemen geri arama şu kişilerden çağrı alıyor:onAvailable()
,onNetworkCapabilitiesChanged()
ve Mobil ağ içinonLinkPropertiesChanged()
, çünkü yalnızca bu kullanılabilir durumda olduğundan emin olun. Başka bir ağ varsa uygulama diğer ağ için geri çağırmalar da alır.
Şekil 1.registerNetworkCallback()
arandıktan sonra uygulama durumu.Ardından uygulama
registerDefaultNetworkCallback()
numarasını çağırır. Varsayılan ağ geri arama,onAvailable()
numaralı telefona arama almaya başlar, Şu süre içinonNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
: mobil ağ, çünkü mobil ağ varsayılan ağdır. Eğer başka bir varsayılan olmayan ağ çalışıyor, uygulama alamıyor varsayılan olmayan ağa çağrı yapar.
Şekil 2. Varsayılan ağ kaydedildikten sonra uygulama durumuDaha sonra, cihaz bir (sınırsız) kablosuz ağa bağlanır. Normal ağ geri çağırması
onAvailable()
numaralı telefona gelen aramaları alır, Şu süre içinonNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
: Kablosuz ağ.
Şekil 3. Sayaçsız bir kablosuz ağa bağlandıktan sonra uygulama durumu.Bu noktada kablosuz ağın doğrulanması biraz zaman alabilir. İçinde bu durumda
onNetworkCapabilitiesChanged()
, normal ağı çağırır geri çağırmaNET_CAPABILITY_VALIDATED
özelliğini içermiyor. Ardından kısa bir süre içindeonNetworkCapabilitiesChanged()
çağrısı alır. Burada Yeni özelliklerNET_CAPABILITY_VALIDATED
içeriyor. Çoğu durumda doğrulama çok hızlıdır.Kablosuz ağ doğrulandığında sistem bunu mobil ağ yerine tercih eder Ağ, özellikle de sınırsız olduğu için. Kablosuz ağ Böylece varsayılan ağa geri çağırma işlevi,
onAvailable()
,onNetworkCapabilitiesChanged()
ve Kablosuz ağ içinonLinkPropertiesChanged()
. Mobil ağ, arka plana alır ve normal ağ geri araması, Mobil ağ içinonLosing()
.Bu örnekte mobil verinin bu cihaz için her zaman açık olduğu varsayıldığından mobil ağ bağlantısı asla kopmaz. Bu ayar kapatılırsa, mobil ağ bağlantısı kesilirken ve normal ağ geri araması ,
onLost()
numaralı telefona bir çağrı alır.
Şekil 4. Kablosuz ağ doğrulandıktan sonra uygulama durumu.Yine de internet bağlantısı kesildiği için cihazın kablosuz bağlantısı aniden kesiliyor. daha yüksek. Kablosuz bağlantı kesildiğinden normal ağ geri çağırması CANNOT TRANSLATE Kablosuz bağlantı için
onLost()
numaralı telefona sesli arama yapın. Mobil yeni varsayılan ağ olduğundan, varsayılan ağ geri çağırmasıonAvailable()
çağrıları alır, Şu süre içinonNetworkCapabilitiesChanged()
veonLinkPropertiesChanged()
: mobil ağ.
Şekil 5. Kablosuz ağ bağlantısı kesildikten sonra uygulama durumu.
Mobil veri her zaman açık ayarı kapalıysa,
Cihazın bağlantısı kesildiğinde, mobil ağa yeniden bağlanmaya çalışılır. Resim
benzer ancak onAvailable()
aramaları için kısa bir ek gecikmeyle
normal ağ geri araması da onAvailable()
çağrıları alır,
onNetworkCapabilitiesChanged()
ve onLinkPropertiesChanged()
, çünkü
mobil cihazlar da kullanılabilir hale gelir.
Veri aktarımı için ağın kullanımına ilişkin kısıtlamalar
Ağ geri çağırma işlevi olan bir ağı görmek, uygulamanızın
veri aktarımı için ağı kullanmaları gerekir. Bazı ağlarda internet bağlantısı yoktur
ve bazı ağlar
tercih edebilirsiniz. İnternet bağlantısını kontrol etmek için bkz.
NET_CAPABILITY_INTERNET
ve
NET_CAPABILITY_VALIDATED
.
Arka plan ağlarının kullanımı da izin kontrollerine tabidir. Uygulamanız
arka planda bir ağ kullanmak istiyorsa
CHANGE_NETWORK_STATE
izni gerekir.
Bu izne sahip uygulamalar, sistemin şunları denemesine izin verir:
örneğin mobil ağ gibi, olmayan bir ağı getirmek için
Cihaz bir kablosuz ağa bağlandığında. Böyle bir uygulama
ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback)
Ağ açıldığında çağrılacak bir NetworkCallback
ile.