Ağ durumunu oku

Android, uygulamaların bağlantıdaki dinamik değişiklikleri öğrenmesini 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ı durumu hakkında bilgi verir.
  • Network sınıfı, cihazın bağlı olduğu ağlardan birini temsil eder. Network nesnesini, ConnectivityManager ile ağ hakkında bilgi toplamak veya ağdaki soketleri bağlamak için anahtar olarak kullanabilirsiniz. Ağ bağlantısı kesildiğinde Network nesnesi kullanılamaz hale gelir. Cihaz daha sonra aynı cihaza yeniden bağlansa bile yeni bir Network nesnesi yeni ağı temsil eder.
  • LinkProperties nesnesi, bir ağın bağlantısıyla ilgili bilgileri (ör. ağ için yüklenen DNS sunucularının listesi, yerel IP adresleri ve ağ rotaları) içerir.
  • NetworkCapabilities nesnesi, ağın özellikleri hakkında bilgi içerir. Örneğin, aktarımlar (kablosuz, mobil, Bluetooth) ve ağın neler yapabileceği gibi. Örneğin, ağın MMS gönderip gönderemeyeceğini, bir giriş portalının arkasında olup olmadığını veya tarifeli olup olmadığını belirlemek için nesneyi sorgulayabilirsiniz.

Herhangi bir zamanda bağlantının anlık durumuyla ilgilenen uygulamalar, hangi ağ türünün kullanılabilir olduğunu öğ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 yararlıdır.

Ancak eşzamanlı 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 vermezler. Ayrıca ağ bağlantısının kesilmesine veya ağ özelliklerinin değişmesine göre uygulama davranışını ayarlayamazlar.

Bağlantı her an değişebilir ve çoğu uygulamanın cihazdaki ağ durumunu her zaman güncel olarak görmesi gerekir. Uygulamalar, ilgilendikleri değişiklikler hakkında uyarı almak için ConnectivityManager ile bir geri çağırma kaydedebilir. Uygulamanız, geri çağırma işlevini kullanarak bağlantıdaki ilgili değişikliklere anında tepki verebilir. Böylece, hızlı güncellemeleri kaçırabilecek pahalı yoklama işlemlerine başvurmak zorunda kalmaz.

NetworkCallback ve cihazın bağlantı durumunu öğrenmenin diğer yollarını kullanmak için özel 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 belgelerine bakın.

Anlık durumu alma

Android destekli bir cihaz aynı anda birçok bağlantıyı sürdürebilir. Mevcut ağ durumu hakkında bilgi edinmek için önce ConnectivityManager örneği 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 yararlı işlev için NetworkCallback kaydedin. Ağ geri çağırmaları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 özelliklerle ilgili 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 özellikleri ile ilgili bilgileri kapsar.

Taşıma, bir ağın çalıştığı fiziksel ortamın soyutlamasıdır. Yaygın taşıma örnekleri Ethernet, kablosuz ağ ve mobil ağdı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. Hem kablosuz hem de mobil ağlar üzerinden çalışan bir VPN buna örnek verilebilir. VPN'de kablosuz, mobil ve VPN aktarımları bulunur. Bir ağın belirli bir aktarım türüne sahip olup olmadığını öğrenmek için NetworkCapabilities.TRANSPORT_* sabitlerinden biriyle NetworkCapabilities.hasTransport(int) yöntemini kullanın.

Özellik, ağın bir niteliğ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ı gönderip alabilir. Bu özelliğe sahip olmayan bir ağ ise bu mesajları gönderip alamaz. NOT_METERED özelliğine sahip bir ağ, kullanıcıdan veri için ücret almaz. Uygulamanız, NetworkCapabilities.NET_CAPABILITY_* sabitlerinden biriyle NetworkCapabilities.hasCapability(int) yöntemini kullanarak uygun özellikleri kontrol edebilir.

En kullanışlı NET_CAPABILITY_* sabitleri şunlardır:

  • NET_CAPABILITY_INTERNET: Ağın internete erişecek şekilde ayarlandığını gösterir. Bu, herkese açık sunuculara erişme becerisi ile değil, kurulum ile ilgilidir. Örneğin, bir ağ internete erişecek ancak giriş portalına tabi olacak şekilde ayarlanabilir.

    Bir operatörün mobil ağında genellikle INTERNET özelliği bulunurken yerel bir P2P kablosuz ağda genellikle bu özellik bulunmaz. Gerçek bağlantı için NET_CAPABILITY_VALIDATED sayfasına bakın.

  • NET_CAPABILITY_NOT_METERED: Ağın kotalı olmadığını gösterir. Kullanıcı, ücretler, veri sınırlamaları veya pil performansı sorunları nedeniyle bir bağlantıda yoğun veri kullanımına karşı hassassa o ağ, kotalı 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, denetlendiğinde herkese açık internete gerçek erişim sağladığını gösterir. Giriş portalının arkasındaki bir 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 verebileceği en yakın bilgidir. Bununla birlikte, 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ğda, incelendiğinde bir giriş portalı olduğunu gösterir.

Daha özel uygulamaların ilgisini çekebilecek 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 her an değişebilir. Sistem bir giriş portalı algıladığında kullanıcıyı giriş yapmaya davet eden bir bildirim gösterir. Bu işlem devam ederken ağ, NET_CAPABILITY_INTERNET ve NET_CAPABILITY_CAPTIVE_PORTAL özelliklerine sahip olur ancak NET_CAPABILITY_VALIDATED özelliğine sahip olmaz.

Kullanıcı işlem yapıp giriş portalı sayfasında oturum açtığında cihaz, herkese açık internete erişebilir ve ağ, NET_CAPABILITY_VALIDATED özelliğini kazanıp NET_CAPABILITY_CAPTIVE_PORTAL özelliğini kaybeder.

Benzer şekilde, bir ağın aktarımları dinamik olarak değişebilir. Örneğin, VPN, temel ağı için mobil ağdan kablosuz ağa geçmek gibi yeni kullanıma sunulan 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ını ise 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 sınırsız ağları sınırlı ağlara, daha hızlı ağları ise daha yavaş ağlara tercih eder.

Bir uygulama, HttpsURLConnection gibi bir ağ isteği gönderdiğinde sistem, varsayılan ağı kullanarak bu isteği karşılar. Uygulamalar diğer ağlarda da trafik gönderebilir. Daha fazla bilgi için ek ağlar ile ilgili bölüme bakın.

Varsayılan ağ olarak ayarlanan ağ, bir uygulamanın kullanım ömrü boyunca herhangi bir zamanda değişebilir. Bilinen, etkin, sınırsız ve mobil ağdan daha hızlı bir kablosuz ağ erişim noktasının kapsama alanına giren cihaz, buna tipik bir örnektir. Cihaz bu erişim noktasına bağlanır ve tüm uygulamalar için varsayılan ağı yeni kablosuz ağ olarak değiştirir.

Yeni bir ağ varsayılan olduğunda, uygulamanın açtığı tüm yeni bağlantılar bu ağı kullanır. Daha sonra, ö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 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 ağ olduğunda uygulama, yeni ağ için onAvailable(Network) çağrısı alır. Bağlantıdaki değişikliklere uygun şekilde tepki vermek için onCapabilitiesChanged(Network,NetworkCapabilities), onLinkPropertiesChanged(Network,LinkProperties) veya her ikisini de uygulayın.

registerDefaultNetworkCallback() ile kaydedilen bir geri çağırma için onLost(), ağın varsayılan ağ olma durumunu kaybettiği anlamına gelir. Bağlantısı kesilmiş olabilir.

NetworkCapabilities.hasTransport(int) sorgusu yaparak varsayılan ağın kullandığı aktarımlar hakkında bilgi edinebilseniz de bu, ağın bant genişliği veya kotalı olup olmadığı konusunda yetersiz 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(), kullanım ölçümünü belirlemek için ise NET_CAPABILITY_NOT_METERED bağımsız değişkenleriyle 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, ConnectivityManager tarafından kullanılan ayrı bir iş parçacığıdır. Geri çağırmaları uygulamanızın daha uzun süre çalışması gerekiyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) varyantını kullanarak bunları ayrı bir çalışan iş parçacığında çağırın.

Artık ihtiyacınız olmadığında ConnectivityManager.unregisterNetworkCallback(NetworkCallback) yöntemini çağırarak geri çağırma işlevinizin kaydını iptal edin. Özellikle geri çağırmayı onResume() içinde kaydederseniz ana etkinliğinizin onPause() yöntemi, bunu yapmak için iyi bir yerdir.

Ek ağlar (ileri düzey kullanım alanları)

Çoğu uygulama için tek alakalı ağ varsayılan ağ olsa da bazı uygulamalar diğer mevcut ağlarla ilgilenebilir. Bu uygulamalar hakkında bilgi edinmek için ihtiyaçlarına uygun bir NetworkRequest oluşturun ve ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback) işlevini çağırın.

Bu işlem, varsayılan bir ağı dinlemeye 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örmesini sağlar. Bu nedenle, onLost(Network) çağrısı, ağın artık varsayılan olmadığı anlamına değil, kalıcı olarak bağlantısının kesildiği anlamına gelir.

Uygulama, dinlemek istediği ağ türlerini ConnectivityManager hizmetine bildirmek için bir NetworkRequest oluşturur. Aşağıdaki örnekte, yalnızca tarifesiz internet bağlantılarıyla ilgilenen bir uygulama için NetworkRequest öğesinin 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 tüm sınırsız ağlarla ilgili değişiklikleri duyduğu anlamına gelir.

Varsayılan ağ geri çağırması için registerNetworkCallback(NetworkRequest, NetworkCallback, Handler)'nin Handler kabul eden bir sürümü vardır. Bu sayede uygulamanızın Connectivity iş parçacığı yüklenmez.

Geri arama artık geçerli olmadığında ConnectivityManager.unregisterNetworkCallback(NetworkCallback) yöntemini çağırın. Bir uygulama aynı anda birden fazla ağ geri çağırma işlevi kaydedebilir.

Kolaylık sağlamak için NetworkRequest nesnesi, çoğu uygulamanın ihtiyaç duyduğu aşağıdaki gibi ortak özellikleri içerir:

Uygulamanızı yazarken varsayılanları kontrol ederek kullanım alanınıza uygun olup olmadıklarını kontrol edin ve uygulamanızın bu özelliklere sahip olmayan ağlar hakkında bildirim almasını istiyorsanız bunları temizleyin. Öte 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 almamak 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 , internetteki bir sunucuyla veri aktarımı yapmak istiyorsanız faydalı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 ağ erişim noktasına bağlanır ve ardından bağlantıyı keser. Örnekte, cihazda Mobil veri her zaman açık ayarının etkinleştirildiği de varsayılmaktadır.

Zaman çizelgesi şu şekildedir:

  1. Uygulama registerNetworkCallback() işlevini çağırdığında geri çağırma, mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() çağrılarını hemen alır. Çünkü yalnızca bu ağ kullanılabilir. Başka bir ağ varsa uygulama, diğer ağ için de geri çağırma alır.

    Ağ geri çağırma kaydı etkinliğini ve etkinlik tarafından tetiklenen geri çağırmaları gösteren durum diyagramı
    Şekil 1. registerNetworkCallback() çağrıldıktan sonraki uygulama durumu.

  2. Ardından uygulama registerDefaultNetworkCallback() yöntemini çağırır. Mobil ağ varsayılan ağ olduğu için varsayılan ağ geri çağırma işlevi, mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() çağrılarını almaya başlar. Varsayılan olmayan başka bir ağ etkinse uygulama, varsayılan olmayan ağ için çağrı alamaz.

    Varsayılan ağ geri çağırma etkinliğini ve etkinlik tarafından tetiklenen geri çağırmaları gösteren durum diyagramı
    Şekil 2. Varsayılan ağ kaydedildikten sonraki uygulama durumu.

  3. Cihaz daha sonra (sınırsız) bir kablosuz ağa bağlanır. Normal ağ geri çağırma işlevi, kablosuz ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() çağrılarını alır.

    Uygulama yeni bir ağa bağlandığında tetiklenen geri çağırmaları gösteren durum diyagramı
    Şekil 3. Kullanım ücretli olmayan bir kablosuz ağa bağlandıktan sonraki uygulama durumu.

  4. Bu noktada, kablosuz ağın doğrulanması biraz zaman alabilir. 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ında NET_CAPABILITY_VALIDATED yer alır. Çoğu durumda doğrulama çok hızlı bir şekilde tamamlanır.

    Kablosuz ağ doğrulandığında sistem, genellikle sınırsız olduğu için mobil ağ yerine kablosuz ağı tercih eder. Kablosuz ağ, varsayılan ağ olur. Bu nedenle, varsayılan ağ geri çağırma işlevi, kablosuz ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() çağrısı alır. Mobil ağ arka plana geçer ve normal ağ geri çağırma işlevi, mobil ağ için onLosing() çağrısı alır.

    Bu örnekte, mobil verinin 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ılırsa bir süre sonra mobil ağ bağlantısı kesilir ve normal ağ geri çağırma işlevi onLost() çağrısı alır.

    Kablosuz ağ bağlantısı doğrulandığında tetiklenen geri çağırmaları gösteren durum diyagramı
    Şekil 4. Kablosuz ağ doğrulandıktan sonraki uygulama durumu.

  5. Daha sonra, cihaz kapsama alanı dışına çıktığı için kablosuz bağlantısı aniden kesilir. Kablosuz bağlantı kesildiğinden normal ağ geri çağırma işlevi, kablosuz ağ için onLost() çağrısı alır. Mobil yeni varsayılan ağ olduğundan, varsayılan ağ geri çağırma işlevi mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() çağrılarını alır.

    Kablosuz ağ bağlantısı kesildiğinde tetiklenen geri çağırmaları gösteren durum diyagramı
    Şekil 5. Kablosuz ağ bağlantısı kesildikten sonraki uygulama durumu.

Mobil veri her zaman açık ayarı kapalıysa kablosuz bağlantı kesildiğinde cihaz bir mobil ağa yeniden bağlanmaya çalışır. Resim benzerdir ancak onAvailable() çağrıları 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() çağrılarını da alır.

Ağın veri aktarımı için kullanımına ilişkin kısıtlamalar

Bir ağı ağ geri çağırma ile görebilmek, 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 sayfalarına 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 olması gerekir.

Bu izne sahip uygulamalar, sistemin, cihaz bir kablosuz ağa bağlıyken mobil ağ gibi etkin olmayan bir ağı etkinleştirmeyi denemesine olanak tanır. Bu tür bir uygulama, ağ açıldığında çağrılacak bir NetworkCallback ile ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) yöntemini çağırır.