Ağ durumunu oku

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çin Network object öğesini anahtar olarak kullanabilir veya ağdaki soketleri bağlayabilirsiniz. ConnectivityManager Ağ bağlantısı kesildiğinde Network nesnesi kullanılamaz. 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ı 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çin NET_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:

  1. Uygulama registerNetworkCallback() işlevini çağırdığında geri çağırma işlevi, yalnızca bu ağ kullanılabilir olduğundan mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() 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.

    Ağ geri çağırma etkinliğini ve etkinlik tarafından tetiklenen geri çağırmaları gösteren durum şeması
    1. Şekil. registerNetworkCallback() numaralı telefonu aradıktan sonraki uygulama durumu.

  2. Ardından uygulama registerDefaultNetworkCallback()'yı arar. Varsayılan ağ geri araması, mobil ağ varsayılan ağ olduğu için mobil ağda onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() 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.

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

  3. Daha sonra cihaz, (ölçülmeyen) bir kablosuz ağa bağlanır. Normal ağ geri araması, kablosuz ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralarına gelen aramaları alır.

    Uygulama yeni bir ağa bağlandığında tetiklenen geri çağırmaları gösteren durum şeması
    3.Şekil Sınırsız kablosuz ağa bağlandıktan sonraki uygulama durumu.

  4. 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ılar NET_CAPABILITY_VALIDATED özelliğini içermez. Kısa bir süre sonra onNetworkCapabilitiesChanged() numaralı telefondan arama alır. Bu telefonda NET_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() ve onLinkPropertiesChanged()'ye yapılan bir çağrı alır. Mobil ağ arka plana gider ve normal ağ geri araması, mobil ağ için onLosing() 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.

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

  5. 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çin onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralarına yapılan aramaları alır.

    Kablosuz ağ bağlantısı kesildiğinde tetiklenen geri çağırmaları gösteren durum şeması
    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.