Mengoptimalkan penggunaan data jaringan

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 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 dari 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. Kemudian pengguna dapat memutuskan apakah akan mengaktifkan data latar belakang untuk aplikasi Anda atau tidak. Sebelum Anda mengirimkan intent ini, sebaiknya tanyakan terlebih dahulu kepada pengguna apakah mereka ingin meluncurkan aplikasi Setelan dengan tujuan 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 atau false.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Menambahkan UID paket yang ditentukan ke daftar yang diizinkan (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 diizinkan (whitelist) untuk memblokir penggunaan data berbayar latar belakang saat Penghemat Data diaktifkan.
$ adb shell cmd netpolicy list wifi-networks
Mencantumkan semua jaringan Wi-Fi, yang menampilkan 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.