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, ağın özellikleri (kablosuz, mobil, Bluetooth) ve ağın yapabilecekleri gibi bilgiler içerir. Örneğin, ağın MMS gönderip gönderemediğini, doğrulama amacıyla yönlendirme yapan bir portalın arkasında olup olmadığını veya ölçülü 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 eşzamanlı ConnectivityManager yöntemleri, bir görüşmeden sonra olan hiçbir şey hakkında uygulamanıza bilgi vermediğinden 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, ilgilendikleri 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ı aramaların çalışması için de 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 öğesinin bir ö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ğ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 kullanışlı işlevler için bir NetworkCallback kaydedin. Ağ geri çağırmalarını kaydetme hakkında daha fazla bilgi için Ağ etkinliklerini dinleme konusuna bakın.

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. Taşıma için yaygın örnekler ethernet, kablosuz ve mobildir. 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, kurulum ile ilgilidir; herkese açık sunuculara erişimin gerçek kabiliyeti değildir. Ö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 söz konusu bağlantıda yoğun veri kullanımına karşı hassas olan ağlar sayaçlı 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. Giriş portalının arkasındaki ağlarda veya alan adı çözümü sunmayan ağlarda bu özellik bulunmaz. 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) sayfasındaki parametre tanımlarını okuyun.

Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem, doğrulama amacıyla yönlendirme yapan bir 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, 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 açılan 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ırken TRANSPORT_VPN aktarımını 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 varsayılan bir ağı vardır. Bu ağ, sistem tarafından belirlenir. 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, cihazın bilinen, etkin, sınırsız ve mobil ağdan daha hızlı bir kablosuz erişim noktasının kapsama alanına girmesi 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. Bir noktada, ö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 aşağıdaki gibi bir varsayılan ağ geri çağırma işlevi 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ı değişikliklerine uygun şekilde tepki vermek için onCapabilitiesChanged(Network,NetworkCapabilities), onLinkPropertiesChanged(Network,LinkProperties) veya her ikisini birden 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.

NetworkCapabilities.hasTransport(int) sorgusunu sorgulayarak varsayılan ağın kullandığı aktarımlar hakkında bilgi edinebilirsiniz. Ancak bu, ağın bant genişliği veya sayaçlığı açısından zayıf 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() 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ğırma uygulamanızın artık çalışması gerekiyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) varyantını kullanarak bunları ayrı bir çalışan iş parçacığında çağırın.

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

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) numaralı telefonu arayı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 mesajları göndermesi gerekiyorsa MMS mesajı gönderemeyen tüm ağların bildirilmesini önlemek için NetworkRequest öğesine NET_CAPABILITY_MMS ekleyin. Uygulamanız yalnızca P2P kablosuz bağlantısı ile ilgileniyorsa TRANSPORT_WIFI_AWARE ekleyin. NET_CAPABILITY_INTERNET ve NET_CAPABILITY_VALIDATED, internetteki bir sunucuyla veri aktarabilmek istiyorsanız kullanışlı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 erişim noktasına bağlanır, daha sonra bağlantısını keser. Örnekte, cihazda Mobil veri her zaman açık ayarının etkin olduğu da varsayılmaktadır.

Zaman çizelgesi aşağıdaki gibidir:

  1. Uygulama registerNetworkCallback() çağırdığında, yalnızca bu ağın kullanılabilir durumda olduğu için geri çağırma işlemi mobil şebeke için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() adlı operatörlerden gelen aramaları anında 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ı
    Şekil 1. registerNetworkCallback() arandıktan sonra uygulama durumu.

  2. Ardından uygulama registerDefaultNetworkCallback() işlevini çağırır. Mobil ağ varsayılan ağ olduğundan, varsayılan ağ geri çağırması mobil şebeke için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralı telefona 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 sonra 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 özelliğini 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 geçer ve normal ağ geri çağırması mobil ağ için onLosing() arasına bir çağrı alır.

    Bu örnekte, mobil verinin bu cihaz için her zaman açık olduğu varsayıldığından mobil ağın 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ını aniden keser. Kablosuz bağlantısı kesildiğinde, normal ağ geri çağırma işlevi kablosuz bağlantı için onLost() adresine bir ç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.

    Kablosuz ağ bağlantısı kesildiğinde tetiklenen geri çağırmaları 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 mobil kullanılabilir hale geldiği için normal ağ geri araması, 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 kısıtlanmış 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 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.