Ağ durumunu oku

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 olarak ConnectivityManager veya ağdaki yuvaları bağlamayı deneyin. Ağ bağlantısı kesilirse Network nesnesi kullanılamaz. Hatta cihazı daha sonra yeniden bağlanıldığında, yeni bir Network 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:

  1. Uygulama registerNetworkCallback() numarasını aradığında hemen geri arama şu kişilerden çağrı alıyor: onAvailable(), onNetworkCapabilitiesChanged() ve Mobil ağ için onLinkPropertiesChanged(), çü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.


    Kayıt ağı geri çağırma etkinliğini ve bu etkinlik tarafından tetiklenen geri çağırmaları gösteren durum şeması Şekil 1. registerNetworkCallback() arandıktan sonra uygulama durumu.

  2. 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çin onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged(): 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.


    Varsayılan ağ geri çağırma etkinliğini ve
etkinlik tarafından tetiklenen geri çağırmalar Şekil 2. Varsayılan ağ kaydedildikten sonra uygulama durumu

  3. Daha 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çin onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged(): Kablosuz ağ.


    Uygulama bir
yeni ağ Şekil 3. Sayaçsız bir kablosuz ağa bağlandıktan sonra uygulama durumu.

  4. Bu noktada kablosuz ağın doğrulanması biraz zaman alabilir. İçinde bu durumda onNetworkCapabilitiesChanged(), normal ağı çağırır geri çağırma NET_CAPABILITY_VALIDATED özelliğini içermiyor. Ardından kısa bir süre içinde onNetworkCapabilitiesChanged() çağrısı alır. Burada Yeni özellikler NET_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çin onLinkPropertiesChanged(). Mobil ağ, arka plana alır ve normal ağ geri araması, Mobil ağ için onLosing().

    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.


    Bir kablosuz ağ bağlandığında tetiklenen geri çağırmaları gösteren durum şeması
bağlantı doğrular Şekil 4. Kablosuz ağ doğrulandıktan sonra uygulama durumu.

  5. 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çin onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged(): mobil ağ.


    Bir kablosuz ağ bağlandığında tetiklenen geri çağırmaları gösteren durum şeması
bağlantı kesildi Ş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.