Selama masa pakai smartphone, biaya untuk paket data seluler dapat dengan mudah melebihi harga perangkat itu sendiri. Pada Android 7.0 (API level 24) dan yang lebih tinggi, pengguna dapat mengaktifkan Penghemat Data di seluruh perangkat untuk mengoptimalkan penggunaan data perangkat dan meminimalkan penggunaan data seluler. Kemampuan ini berguna khususnya saat roaming, saat hampir mencapai akhir siklus tagihan, atau untuk paket data prabayar kecil.
Ketika pengguna mengaktifkan Penghemat Data dalam Setelan dan perangkat sedang menggunakan jaringan berkuota, sistem akan memblokir penggunaan data latar belakang dan memberi tahu aplikasi untuk menggunakan data di latar depan seminimal mungkin. Pengguna dapat mengizinkan aplikasi tertentu menggunakan penggunaan data berbayar di latar belakang meskipun Penghemat Data diaktifkan.
Android 7.0 (API level 24) meluaskan
ConnectivityManager
API untuk memungkinkan aplikasi memperoleh preferensi Penghemat
Data pengguna dan memantau perubahan
preferensi. Hal ini dianggap praktik yang baik bagi aplikasi untuk memeriksa apakah
pengguna sudah mengaktifkan Penghemat Data, serta mencoba membatasi penggunaan data latar depan dan
data latar belakang.
Memeriksa preferensi penghemat data
Pada Android 7.0 (API level 24) dan yang lebih tinggi, aplikasi dapat menggunakan
ConnectivityManager
API
untuk menentukan jenis pembatasan penggunaan data mana yang berlaku. Metode
getRestrictBackgroundStatus()
menampilkan salah satu dari nilai berikut:
-
RESTRICT_BACKGROUND_STATUS_DISABLED
- Penghemat Data dinonaktifkan.
-
RESTRICT_BACKGROUND_STATUS_ENABLED
- Pengguna telah mengaktifkan Penghemat Data untuk aplikasi ini. Aplikasi harus berusaha membatasi penggunaan data di latar depan dan menangani pembatasan untuk penggunaan data latar belakang dengan lancar.
-
RESTRICT_BACKGROUND_STATUS_WHITELISTED
- Pengguna telah mengaktifkan Penghemat Data tetapi aplikasi diizinkan untuk mengabaikannya. Aplikasi harus tetap berupaya membatasi penggunaan data latar depan dan data latar belakang.
Batasi penggunaan data ketika perangkat terhubung ke jaringan berkuota, meskipun Penghemat Data
dinonaktifkan atau aplikasi diizinkan untuk mengabaikannya. Kode contoh berikut menggunakan
ConnectivityManager.isActiveNetworkMetered()
dan ConnectivityManager.getRestrictBackgroundStatus()
untuk menentukan berapa banyak data
yang seharusnya digunakan aplikasi:
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. }
Catatan: Perilaku ini berbeda di Android TV. Android TV
tidak akan memblokir penggunaan di latar belakang, tetapi hanya melakukan throttle. Saat ada di
latar depan, penggunaan data di aplikasi dibatasi hingga 800 Kbps, dan saat di latar belakang,
penggunaan dibatasi hingga 10 Kbps. Gunakan
ConnectivityManager.isActiveNetworkMetered()
untuk mendeteksi kapan harus
membatasi penggunaan data di TV.
Meminta izin batasan data
Jika aplikasi Anda perlu menggunakan data di latar belakang, aplikasi dapat meminta
izin batasan data dengan mengirimkan intent
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
yang berisi URI nama paket aplikasi Anda: misalnya,
package:MY_APP_ID
.
Mengirim intent dan URI akan meluncurkan aplikasi Setelan dan menampilkan setelan penggunaan data untuk aplikasi Anda. Pengguna kemudian dapat memutuskan apakah akan mengaktifkan data latar belakang untuk aplikasi Anda atau tidak. Sebelum Anda mengirim intent ini, sebaiknya tanyakan kepada pengguna apakah mereka ingin meluncurkan aplikasi Setelan terlebih dahulu untuk mengaktifkan penggunaan data latar belakang.
Memantau perubahan pada preferensi penghemat data
Aplikasi dapat memantau perubahan pada preferensi Penghemat Data dengan membuat
BroadcastReceiver
untuk
memproses ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
dan secara dinamis
mendaftarkan penerima dengan
Context.registerReceiver()
.
Saat menerima siaran ini, aplikasi harus memeriksa apakah preferensi Penghemat Data
yang baru memengaruhi izinnya dengan memanggil
ConnectivityManager.getRestrictBackgroundStatus()
.
Catatan: Sistem hanya mengirimkan siaran ini ke aplikasi yang secara dinamis mendaftarkannya
dengan
Context.registerReceiver()
.
Aplikasi yang mendaftar untuk menerima siaran ini dalam manifesnya tidak akan menerimanya.
Menguji dengan perintah Android Debug Bridge
Android Debug Bridge (ADB) menyediakan beberapa perintah yang bisa Anda gunakan untuk menguji aplikasi dalam kondisi Penghemat Data. Anda dapat memeriksa dan mengonfigurasi izin jaringan atau menetapkan jaringan nirkabel sebagai berbayar untuk menguji aplikasi Anda di jaringan tidak berbayar.
-
$ adb shell dumpsys netpolicy
- Menghasilkan laporan yang mencakup setelan pembatasan jaringan latar belakang global saat ini, UID paket yang saat ini diizinkan untuk mengabaikan Penghemat Data, dan izin jaringan untuk paket lain yang diketahui.
-
$ adb shell cmd netpolicy
- Menampilkan daftar lengkap perintah Network Policy Manager (netpolicy).
-
$ adb shell cmd netpolicy set restrict-background <boolean>
-
Mengaktifkan atau menonaktifkan mode Penghemat Data saat meneruskan
true
ataufalse
. -
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
-
Menambahkan UID paket yang ditentukan ke daftar yang diberi akses (
whitelist
) untuk mengizinkan penggunaan data berbayar latar belakang. -
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
-
Menghapus UID paket yang ditentukan dari daftar yang diberi akses (
whitelist
) untuk memblokir penggunaan data berbayar latar belakang saat Penghemat Data diaktifkan. -
$ adb shell cmd netpolicy list wifi-networks
- Menampilkan daftar semua jaringan wifi, yang menunjukkan apakah jaringan tersebut berbayar atau tidak.
-
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
- Menetapkan Wi-Fi dengan SSID yang ditentukan sebagai berkuota, yang memungkinkan Anda menyimulasikan jaringan berkuota pada jaringan tidak berkuota.