Ağ veri kullanımını optimize etme

Bir akıllı telefonun kullanım ömrü boyunca, hücresel veri planının maliyeti kolayca cihazın kendi maliyetini aşabilir. Android 7.0 (API düzeyi 24) ve sonraki sürümlerde kullanıcılar, cihazlarının veri kullanımını optimize etmek ve daha az veri kullanmak için Veri Tasarrufu'nu cihaz genelinde etkinleştirebilirler. Bu özellik, özellikle dolaşımdayken, faturalandırma döneminin sonuna yaklaştığında veya ön ödemeli küçük bir veri paketi söz konusu olduğunda faydalıdır.

Kullanıcı, Veri Tasarrufu'nu Ayarlar'da etkinleştirdiğinde ve cihaz sayaçlı bir ağa bağlıysa sistem arka planda veri kullanımını engeller ve mümkün olduğunda uygulamaların ön planda daha az veri kullanması için sinyal gönderir. Kullanıcılar, Veri Tasarrufu açık olduğunda bile belirli uygulamaların arka planda ölçülen veri kullanımını kullanmasına izin verebilir.

Android 7.0 (API düzeyi 24), ConnectivityManager API'nin kapsamını genişleterek uygulamalara kullanıcının Veri Tasarrufu tercihlerini alma ve tercih değişikliklerini izleme bir yöntem sunar. Uygulamaların, kullanıcının Veri Tasarrufu'nu etkinleştirip etkinleştirmediğini kontrol etmesi ve ön plan ile arka plandaki veri kullanımını sınırlamaya çalışması iyi bir uygulama olarak kabul edilir.

Veri tasarrufu tercihlerini kontrol edin

Uygulamalar, Android 7.0 (API düzeyi 24) ve sonraki sürümlerde hangi veri kullanımı kısıtlamalarının uygulandığını belirlemek için ConnectivityManager API'yi kullanabilir. getRestrictBackgroundStatus() yöntemi, aşağıdaki değerlerden birini döndürür:

RESTRICT_BACKGROUND_STATUS_DISABLED
Veri Tasarrufu devre dışı bırakıldı.
RESTRICT_BACKGROUND_STATUS_ENABLED
Kullanıcı, bu uygulama için Veri Tasarrufu'nu etkinleştirdi. Uygulamalar ön planda veri kullanımını sınırlamaya ve arka plan veri kullanımıyla ilgili kısıtlamaları sorunsuz bir şekilde ele almaya çalışmalıdır.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
Kullanıcı Veri Tasarrufu'nu etkinleştirmiş ancak uygulamanın bunu atlamasına izin veriliyor. Uygulamaların yine de ön plan ve arka plan veri kullanımını sınırlamak için çaba göstermesi gerekir.

Cihaz sayaçlı bir ağa bağlandığında (Veri Tasarrufu devre dışı bırakılmış veya uygulamanın atlamasına izin verilmiş olsa bile) veri kullanımını sınırlayın. Aşağıdaki örnek kod, uygulamanın ne kadar veri kullanması gerektiğini belirlemek için ConnectivityManager.isActiveNetworkMetered() ve ConnectivityManager.getRestrictBackgroundStatus() öğelerini kullanır:

Kotlin

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
    // Checks if the device is on a metered network
    if (isActiveNetworkMetered) {
        // Checks user’s Data Saver settings.
        when (restrictBackgroundStatus) {
            RESTRICT_BACKGROUND_STATUS_ENABLED -> {
                // Background data usage is blocked for this app. Wherever possible,
                // the app should also use less data in the foreground.
            }
            RESTRICT_BACKGROUND_STATUS_WHITELISTED -> {
                // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
                // the app should use less data in the foreground and background.
            }
            RESTRICT_BACKGROUND_STATUS_DISABLED -> {
                // Data Saver is disabled. Since the device is connected to a
                // metered network, the app should use less data wherever possible.
            }
        }
    } else {
        // The device is not on a metered network.
        // Use data as required to perform syncs, downloads, and updates.
    }
}

Java

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
    // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
    // the app should use less data in the foreground and background.

    case RESTRICT_BACKGROUND_STATUS_DISABLED:
    // Data Saver is disabled. Since the device is connected to a
    // metered network, the app should use less data wherever possible.
  }
} else {
  // The device is not on a metered network.
  // Use data as required to perform syncs, downloads, and updates.
}

Not: Bu davranış Android TV'de farklıdır. Android TV, arka plan kullanımını engellemek yerine yalnızca onu kısıtlar. Uygulamalar ön planda 800 Kb/sn., arka planda çalışırken ise 10 Kb/sn ile sınırlanır. TV'de veri kullanımının ne zaman sınırlanacağını belirlemek için ConnectivityManager.isActiveNetworkMetered() kullanın.

Veri kısıtlama izinleri isteyin

Uygulamanızın arka planda veri kullanması gerekiyorsa uygulamanızın paket adının URI'sini (ör. package:MY_APP_ID) içeren bir Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS niyeti göndererek veri kısıtlama izinleri isteyebilir.

Niyet ve URI'yı gönderdiğinizde, Ayarlar uygulaması açılır ve uygulamanız için veri kullanımı ayarları görüntülenir. Kullanıcı, daha sonra uygulamanız için arka plan verilerinin etkinleştirilip etkinleştirilmeyeceğine karar verebilir. Bu amacı göndermeden önce kullanıcıya, arka plan veri kullanımını etkinleştirmek amacıyla Ayarlar uygulamasını başlatmak isteyip istemediğini sormak iyi bir fikirdir.

Veri tasarrufu tercihlerinde yapılan değişiklikleri izleme

Uygulamalar, ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED dinlemek için BroadcastReceiver oluşturarak ve alıcıyı Context.registerReceiver() ile dinamik olarak kaydederek Veri Tasarrufu tercihlerinde yapılan değişiklikleri izleyebilir. Bir uygulama bu yayını aldığında ConnectivityManager.getRestrictBackgroundStatus() yöntemini çağırarak yeni Veri Tasarrufu tercihlerinin izinlerini etkileyip etkilemediğini kontrol etmelidir.

Not: Sistem bu yayını yalnızca Context.registerReceiver() ile dinamik olarak kaydolan uygulamalara gönderir. Bu yayını manifest dosyalarında almak için kaydolan uygulamalar, bunları almaz.

Android Debug Bridge komutlarıyla test etme

Android Debug Bridge (ADB), uygulamanızı Veri Tasarrufu koşullarında test etmek için kullanabileceğiniz birkaç komut sağlar. Uygulamanızı sınırsız ağlarda test etmek için ağ izinlerini kontrol edip yapılandırabilir veya kablosuz ağları sınırlı olarak ayarlayabilirsiniz.

$ adb shell dumpsys netpolicy
Mevcut genel arka plan ağ kısıtlaması ayarını, Veri Tasarrufu'nu atlamasına izin verilen paket UID'lerini ve bilinen diğer paketlerin ağ izinlerini içeren bir rapor oluşturur.
$ adb shell cmd netpolicy
Ağ Politikası Yöneticisi (netpolicy) komutlarının tam listesini gösterir.
$ adb shell cmd netpolicy set restrict-background <boolean>
Sırasıyla true veya false geçerken Veri Tasarrufu modunu etkinleştirir veya devre dışı bırakır.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Arka planda ölçülen veri kullanımına izin vermek için, belirtilen paket UID'sini izin verilenler listesine (whitelist) ekler.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Veri Tasarrufu etkin durumdayken arka planda ölçülen veri kullanımını engellemek için, belirtilen paket UID'sini izin verilenler listesinden (whitelist) kaldırır.
$ adb shell cmd netpolicy list wifi-networks
Tüm kablosuz ağları listeler ve bunların ölçülü olup olmadığını gösterir.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Belirtilen SSID ile kablosuz ağı sayaçlı olarak ayarlar. Böylece, sınırsız bir ağda sayaçlı bir ağı simüle edebilirsiniz.