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, 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çin Network nesnesi 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 Network 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, bir ağın özellikleri (ör. aktarım araçları [kablosuz, mobil, Bluetooth]) ve ağın yapabilecekleriyle ilgili bilgileri içerir. Örneğin, ağın MMS gönderip gönderemediğini, giriş portalının arkasında olup olmadığını veya ücretli 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 senkronize 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 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, önemsediği 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ı çağrıların çalışması için 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 örneği elde edin:

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 kullanışlı işlevler için bir NetworkCallback kaydedin. Ağ geri çağırma işlevlerini 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 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. Ethernet, kablosuz ağ ve mobil, aktarım için yaygın örneklerdir. 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, herkese açık sunuculara erişme yeteneği ile ilgili değil, kurulum ile ilgilidir. Ö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çin NET_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 bağlantıda yoğun veri kullanımına duyarlıysa ağ, ücretli 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. Kapalı portalın arkasındaki ağlar veya alan adı çözümlemesi sağlamayan ağlar bu özelliğe sahip değildir. 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) adresindeki parametre tanımlarını okuyun.

Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem, bir kapılı 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, bir 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 ortaya çıkan 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ı ise korunur.

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 bir varsayılan ağı vardır. 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, bilinen, etkin, sınırsız ve mobil ağdan daha hızlı bir kablosuz erişim noktasının kapsama alanına giren cihaz 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. Daha sonra, önceki varsayılan ağdaki 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 olduğunda 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 geri aramalarda onLost(), ağın varsayılan ağ olma durumunu kaybettiği anlamına gelir. Bağlantısı kesilmiş olabilir.

NetworkCapabilities.hasTransport(int) parametresini sorguladığınızda varsayılan ağın kullandığı aktarım türleri hakkında bilgi edinebilirsiniz. Ancak bu, ağın bant genişliği veya ölçümü için iyi bir proxy değildir. 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ğırmalarınızın daha uzun süre çalışması gerekiyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) varyantını kullanarak bunları ayrı bir işleyici iş parçacığında çağırın.

Artık ihtiyacınız olmadığında ConnectivityManager.unregisterNetworkCallback(NetworkCallback) numaralı telefonu arayarak geri arama kaydınızı iptal edin. Özellikle geri aramayı onResume()'e kaydettiyseniz bunu yapmak için ana etkinliğinizin onPause() bölümü uygundur.

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) düğmesini tıklayı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 mesajı göndermesi gerekiyorsa NetworkRequest alanına NET_CAPABILITY_MMS ekleyerek MMS mesajı gönderemeyen tüm ağlar hakkında bilgi almanızı önleyebilirsiniz. Uygulamanız yalnızca P2P kablosuz bağlantısı ile ilgileniyorsa TRANSPORT_WIFI_AWARE ekleyin. NET_CAPABILITY_INTERNET ve NET_CAPABILITY_VALIDATED, internetteki bir sunucuya veri aktarma özelliğiyle ilgileniyorsanız faydalı olacaktı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 ve ardından bağlantısını keser. Örnekte, cihazda Mobil veri her zaman açık ayarının etkin olduğu da varsayılır.

Zaman çizelgesi aşağıdaki gibidir:

  1. Uygulama registerNetworkCallback()'ü aradığında geri arama, yalnızca mobil ağ mevcut olduğu için mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged()'den gelen aramaları hemen alır. Başka bir ağ varsa uygulama, diğer ağ için geri arama da alır.

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

  2. Ardından uygulama registerDefaultNetworkCallback() işlevini çağırır. Varsayılan ağ geri çağırma işlevi, mobil ağ varsayılan ağ olduğu için mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() adreslerine gelen aramaları almaya başlar. Varsayılan olmayan başka bir ağ etkinse uygulama, varsayılan olmayan ağ için arama alamaz.

    Varsayılan ağ geri çağırma etkinliğini ve etkinlik tarafından tetiklenen geri çağırma işlevlerini gösteren durum diyagramı
    Şekil 2. Varsayılan bir ağ kaydettikten sonra uygulama durumu.

  3. 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() ve onLinkPropertiesChanged() adreslerine gelen aramaları alır.

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

  4. 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 işlevini içermez. Kısa bir süre sonra, onNetworkCapabilitiesChanged() adresine bir çağrı alır. Bu çağrıda, yeni özellikler arasında NET_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() ve onLinkPropertiesChanged() adresine bir çağrı alır. Mobil ağ arka plana gider ve normal ağ geri araması, mobil ağ için onLosing() adresine bir çağrı alır.

    Bu örnekte, bu cihazda mobil verilerin her zaman açık olduğu varsayıldığı için mobil ağ 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.

    Bir kablosuz ağ bağlantısı doğrulandığında tetiklenen geri çağırma işlevlerini gösteren durum diyagramı
    Şekil 4. Kablosuz ağ doğrulandıktan sonra uygulama durumu.

  5. Daha sonra, cihaz kapsama alanından çıktığı için kablosuz bağlantısı aniden kesilir. Kablosuz bağlantısı kesildiğinde, normal ağ geri çağırma işlevi kablosuz bağlantı için onLost()'e çağrı alır. Mobil yeni varsayılan ağ olduğundan varsayılan ağ geri araması, mobil ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralarına gelen aramaları alır.

    Bir kablosuz ağ bağlantısı kaybedildiğinde tetiklenen geri çağırma işlevlerini gösteren durum diyagramı
    Ş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 normal ağ geri araması, mobil kullanılabilir hale geldiği için 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 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 denetimlerine 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.