Bir telefonun kullanım ömrü boyunca mobil veri tarifesinin maliyeti, 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 cihaz genelinde Veri Tasarrufu'nu etkinleştirebilir. Bu özellik, özellikle dolaşımdayken, faturalandırma döneminin sonuna yaklaşıldığında veya küçük bir ön ödemeli veri paketi için kullanışlıdır.
Kullanıcı Ayarlar'da Veri Tasarrufu'nu etkinleştirdiğinde ve cihaz, tarifeli bir ağda olduğunda sistem, arka planda veri kullanımını engeller ve uygulamalara mümkün olduğunca ön planda daha az veri kullanmaları için sinyal gönderir. Kullanıcılar, Veri Tasarrufu açıkken bile belirli uygulamaların arka planda ücretli veri kullanımına izin verebilir.
Android 7.0 (API düzeyi 24), uygulamalara kullanıcının Veri Tasarrufu tercihlerini alma ve tercih değişikliklerini izleme olanağı sunmak için ConnectivityManager API'sini genişletir. Uygulamaların, kullanıcının Veri Tasarrufu'nu etkinleştirip etkinleştirmediğini kontrol etmesi ve ön planda ve arka planda veri kullanımını sınırlamaya çalışması iyi bir uygulama olarak kabul edilir.
Veri Tasarrufu tercihlerini kontrol etme
Android 7.0 (API düzeyi 24) ve sonraki sürümlerde uygulamalar, hangi veri kullanımı kısıtlamalarının uygulandığını belirlemek için ConnectivityManager API'sini 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 planda veri kullanımı kısıtlamalarını sorunsuz bir şekilde yönetmeye çalışmalıdır.
-
RESTRICT_BACKGROUND_STATUS_WHITELISTED - Kullanıcı Veri Tasarrufu'nu etkinleştirdi ancak uygulamanın bunu atlamasına izin veriliyor. Uygulamalar, ön plan ve arka plan veri kullanımını sınırlamak için yine de çaba göstermelidir.
Veri Tasarrufu devre dışı bırakılmış veya uygulamanın bu özelliği atlamasına izin verilmiş olsa bile cihaz, ücretli bir ağa bağlıyken veri kullanımını sınırlandırın. Aşağıdaki örnek kod, uygulamanın ne kadar veri kullanması gerektiğini belirlemek için ConnectivityManager.isActiveNetworkMetered() ve ConnectivityManager.getRestrictBackgroundStatus() kullanır:
with(getSystemService(ConnectivityManager::class.java)) { // 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. } }
Not: Bu davranış Android TV'de farklıdır. Android TV, arka plan kullanımını engellemek yerine yalnızca kısıtlar. Uygulamalar ön plandayken 800 Kb/sn., arka plandayken ise 10 Kb/sn. ile sınırlıdır. TV'de veri kullanımının ne zaman sınırlandırılacağını belirlemek için ConnectivityManager.isActiveNetworkMetered() kullanın.
Veri kısıtlama izinleri isteme
Uygulamanızın arka planda veri kullanması gerekiyorsa uygulamanızın paket adının URI'sini içeren bir Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS intent'i (ör. package:MY_APP_ID) göndererek veri kısıtlama izinleri isteyebilir.
Intent ve URI gönderildiğinde Ayarlar uygulaması başlatılır ve uygulamanızın veri kullanımı ayarları gösterilir. Kullanıcı daha sonra uygulamanız için arka plan verilerini etkinleştirip etkinleştirmeyeceğine karar verebilir. Bu intent'i göndermeden önce kullanıcıya arka plan veri kullanımını etkinleştirmek için Ayarlar uygulamasını başlatmak isteyip istemediğini sormanız iyi bir uygulamadır.
Veri Tasarrufu tercihlerindeki değişiklikleri izleme
Uygulamalar, ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED için dinleme yapacak bir BroadcastReceiver oluşturarak ve alıcıyı Context.registerReceiver() ile dinamik olarak kaydederek Veri Tasarrufu tercihlerindeki 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ı almak için manifest dosyalarında kaydolan uygulamalar yayını 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. Ağ izinlerini kontrol edip yapılandırabilir veya uygulamanızı sınırsız ağlarda test etmek için kablosuz ağları sayaçlı olarak ayarlayabilirsiniz.
-
$ adb shell dumpsys netpolicy - Mevcut genel arka plan ağı kısıtlama ayarını, Veri Tasarrufu'nu atlamasına izin verilen paket UID'lerini ve diğer bilinen paketlerin ağ izinlerini içeren bir rapor oluşturur.
-
$ adb shell cmd netpolicy - Ağ Politikası Yöneticisi (netpolicy) komutlarının tam listesini görüntüler.
-
$ adb shell cmd netpolicy set restrict-background <boolean> -
Sırasıyla
trueveyafalsedeğerleri iletildiğinde Veri Tasarrufu modunu etkinleştirir ya da devre dışı bırakır. -
$ adb shell cmd netpolicy add restrict-background-whitelist <UID> -
Arka planda ücretli 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 etkinken arka planda ücretli 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 ağların ücretli olup olmadığını gösterir.
-
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true - Belirtilen SSID'ye sahip kablosuz ağı, sayaçlı olarak ayarlar. Böylece, sınırsız bir ağda sayaçlı bir ağı simüle edebilirsiniz.