Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Mengoptimalkan penggunaan data jaringan

Selama penggunaan smartphone, biaya paket kuotanya bisa melebihi harga perangkat itu sendiri. Dari Android 7.0 (API level 24), pengguna bisa mengaktifkan Penghemat Kuota di seluruh perangkat untuk mengoptimalkan penggunaan data perangkat dan meminimalkan penggunaan kuota. Kemampuan ini berguna khususnya saat roaming, saat hampir mencapai akhir siklus tagihan, atau untuk paket data prabayar kecil.

Ketika pengguna mengaktifkan Penghemat Kuota dalam Setelan dan perangkat sedang menggunakan jaringan berbayar, sistem akan memblokir penggunaan data di latar belakang dan memberi tahu aplikasi untuk menggunakan seminimal mungkin data di latar depan. Pengguna bisa memasukkan aplikasi tertentu ke daftar yang disetujui agar penggunaan data berbayar di latar belakang tetap aktif meskipun Penghemat Kuota diaktifkan.

Android 7.0 (API level 24) mengembangkan API ConnectivityManager untuk memungkinkan aplikasi memperoleh preferensi Penghemat Kuota pengguna dan memantau perubahan preferensi. Ini dapat menjadi cara yang baik bagi aplikasi untuk memeriksa apakah pengguna sudah mengaktifkan Penghemat Kuota, serta mencoba membatasi penggunaan data latar depan dan data latar belakang.

Memeriksa preferensi penghemat kuota

Di Android 7.0 (API level 24), aplikasi bisa menggunakan API ConnectivityManager untuk menentukan pembatasan penggunaan data mana yang diterapkan. Metode getRestrictBackgroundStatus() mengembalikan salah satu dari nilai berikut:

RESTRICT_BACKGROUND_STATUS_DISABLED
Penghemat Kuota dinonaktifkan.
RESTRICT_BACKGROUND_STATUS_ENABLED
Pengguna sudah mengaktifkan Penghemat Kuota untuk aplikasi ini. Aplikasi harus berupaya membatasi penggunaan data di latar depan dan menangani pembatasan penggunaan data latar belakang tanpa masalah.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
Pengguna mengaktifkan Penghemat Kuota tetapi aplikasi sudah dimasukkan ke daftar yang disetujui. Aplikasi harus tetap berupaya membatasi penggunaan data latar belakang dan latar depan.

Cara ini dapat menjadi langkah yang tepat untuk membatasi penggunaan data ketika perangkat terhubung ke jaringan berbayar, meskipun Penghemat Kuota dinonaktifkan atau aplikasi sudah dimasukkan ke daftar yang disetujui. Kode sampel berikut ini menggunakan ConnectivityManager.isActiveNetworkMetered() dan ConnectivityManager.getRestrictBackgroundStatus() untuk menentukan berapa banyak data yang harus 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 whitelisted. 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 whitelisted. 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.
    }
    

Meminta izin daftar yang disetujui

Jika harus menggunakan data di latar belakang, aplikasi bisa meminta izin daftar yang disetujui 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 bisa memutuskan apakah akan mengaktifkan data latar belakang untuk aplikasi Anda. Sebelum intent dikirimkan, sebaiknya tanyakan terlebih dahulu kepada pengguna apakah mereka ingin meluncurkan aplikasi Setelan untuk keperluan mengaktifkan penggunaan data latar belakang.

Memantau perubahan pada preferensi penghemat kuota

Aplikasi bisa memantau perubahan preferensi Penghemat Kuota dengan membuat BroadcastReceiver untuk mendengarkan ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED dan secara dinamis mendaftarkan penerima dengan Context.registerReceiver(). Ketika menerima siaran ini, aplikasi harus memeriksa apakah preferensi Penghemat Kuota yang baru memengaruhi izinnya dengan memanggil ConnectivityManager.getRestrictBackgroundStatus().

Catatan: Sistem hanya mengirimkan siaran ini ke aplikasi yang secara dinamis mendaftar untuknya 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 ketentuan Penghemat Kuota. Anda bisa memeriksa dan mengonfigurasi izin jaringan atau menyetel jaringan nirkabel sebagai berbayar untuk menguji aplikasi 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 termasuk dalam daftar yang disetujui, 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 Kuota saat meneruskan masing-masing true atau false.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Menambahkan UID paket yang ditentukan ke daftar yang disetujui untuk mengizinkan penggunaan data berbayar di latar belakang.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Menghapus UID paket yang ditentukan dari daftar yang disetujui untuk memblokir penggunaan data berbayar di latar belakang saat Penghemat Kuota diaktifkan.
$ adb shell cmd netpolicy list wifi-networks
Mencantumkan semua jaringan wi-fi, yang menampilkan apakah jaringan tersebut berbayar.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Menyetel wi-fi dengan SSID yang ditentukan sebagai berbayar, yang memungkinkan Anda menyimulasikan jaringan berbayar pada jaringan tidak berbayar.