Android memiliki dua fitur hemat daya yang memperpanjang masa pakai baterai bagi pengguna dengan mengelola perilaku aplikasi saat perangkat tidak terhubung ke sumber daya: Istirahatkan dan Aplikasi Standby. Doze mengurangi konsumsi baterai dengan menunda aktivitas CPU dan jaringan latar belakang untuk aplikasi saat perangkat tidak digunakan dalam waktu lama. Aplikasi Standby menunda aktivitas jaringan latar belakang untuk aplikasi yang tidak memiliki aktivitas pengguna terbaru.
Saat perangkat dalam mode Istirahatkan, akses aplikasi ke resource tertentu yang boros baterai akan ditunda hingga masa pemeliharaan. Pembatasan spesifik tercantum dalam Pembatasan pengelolaan daya.
Doze dan Aplikasi Standby mengelola perilaku semua aplikasi yang berjalan di Android 6.0 atau yang lebih tinggi, terlepas dari apakah aplikasi tersebut secara khusus menargetkan API level 23. Untuk membantu memastikan pengalaman terbaik bagi pengguna, uji aplikasi Anda dalam mode Istirahatkan dan Aplikasi Standby, lalu lakukan penyesuaian yang diperlukan pada kode Anda. Bagian berikut memberikan detailnya.
Memahami Mode Istirahatkan
Jika pengguna membiarkan perangkat tidak dicolokkan dan tidak bergerak selama jangka waktu tertentu, dengan layar nonaktif, perangkat akan memasuki mode Istirahatkan. Dalam mode Istirahat, sistem akan mencoba menghemat baterai dengan membatasi akses aplikasi ke layanan yang menggunakan banyak CPU dan jaringan. Mode ini juga mencegah aplikasi mengakses jaringan dan menunda tugas, sinkronisasi, dan alarm standarnya.
Secara berkala, sistem akan keluar dari mode Istirahat dalam waktu singkat agar aplikasi dapat menyelesaikan aktivitas yang ditangguhkan. Selama masa pemeliharaan ini, sistem akan menjalankan semua sinkronisasi, tugas, dan alarm yang tertunda, serta mengizinkan aplikasi mengakses jaringan.
Setelah masa pemeliharaan berakhir, sistem akan kembali memasuki mode Istirahat, menangguhkan akses jaringan dan menunda tugas, sinkronisasi, dan alarm. Seiring waktu, sistem akan mengurangi frekuensi penjadwalan masa pemeliharaan, sehingga membantu mengurangi konsumsi baterai jika perangkat tidak aktif dalam waktu lama saat tidak diisi dayanya.
Saat pengguna mengaktifkan perangkat dengan memindahkannya, menyalakan layar, atau menghubungkan pengisi daya, sistem akan keluar dari mode Istirahat dan semua aplikasi melanjutkan aktivitas normal.
Pembatasan Mode Istirahatkan
Sistem menerapkan batasan berikut pada aplikasi Anda saat dalam mode Istirahatkan:
- Menangguhkan akses jaringan.
- Mengabaikan penguncian layar saat aktif.
- Menunda alarm
AlarmManagerstandar, termasuksetExact()dansetWindow(), ke masa pemeliharaan berikutnya.- Jika Anda perlu menyetel alarm yang diaktifkan saat dalam mode Istirahat, gunakan
setAndAllowWhileIdle()atausetExactAndAllowWhileIdle(). - Alarm yang disetel dengan
setAlarmClock()akan terus diaktifkan seperti biasa. Sistem akan keluar dari mode Istirahat sesaat sebelum alarm tersebut diaktifkan.
- Jika Anda perlu menyetel alarm yang diaktifkan saat dalam mode Istirahat, gunakan
- Tidak melakukan pemindaian Wi-Fi.
- Tidak mengizinkan adaptor sinkronisasi berjalan.
- Tidak mengizinkan
JobSchedulerberjalan.
Checklist mode Istirahatkan
- Jika memungkinkan, gunakan Firebase Cloud Messaging (FCM) untuk pesan downstream.
- Jika pengguna Anda harus segera melihat notifikasi, gunakan jenis pesan
RemoteNotification. Untuk panduan selengkapnya, lihat dokumentasi FCM tentang jenis pesanRemoteNotification. - Berikan informasi yang memadai dalam payload pesan awal, sehingga akses jaringan berikutnya tidak diperlukan.
- Setel alarm penting dengan
setAndAllowWhileIdle()dansetExactAndAllowWhileIdle(). - Menguji aplikasi dalam mode Istirahatkan.
Menyesuaikan aplikasi Anda dengan mode Istirahatkan
Doze dapat memengaruhi aplikasi secara berbeda, bergantung pada kemampuan yang ditawarkan dan layanan yang digunakan. Banyak aplikasi berfungsi normal di seluruh siklus Istirahat tanpa modifikasi. Dalam beberapa kasus, Anda harus mengoptimalkan cara aplikasi mengelola jaringan, alarm, tugas, dan sinkronisasi. Aplikasi harus dapat mengelola aktivitas secara efisien selama setiap masa pemeliharaan.
Untuk membantu menjadwalkan alarm, Anda dapat menggunakan dua metode AlarmManager: setAndAllowWhileIdle() dan
setExactAndAllowWhileIdle(). Dengan metode ini, Anda dapat menyetel alarm
yang diaktifkan meskipun perangkat dalam mode Istirahatkan.
Pembatasan Istirahat pada akses jaringan juga kemungkinan akan memengaruhi aplikasi Anda, terutama jika aplikasi mengandalkan pesan real-time seperti tickle atau notifikasi. Jika aplikasi Anda memerlukan koneksi persisten ke jaringan untuk menerima pesan, gunakan Firebase Cloud Messaging (FCM) jika memungkinkan.
Untuk mengonfirmasi bahwa aplikasi Anda berperilaku seperti yang diharapkan dengan mode Istirahatkan, Anda dapat menggunakan
perintah adb untuk memaksa sistem masuk dan keluar dari mode Istirahatkan dan
mengamati perilaku aplikasi Anda. Untuk mengetahui detailnya, lihat
Menguji dengan Mode Istirahatkan dan Aplikasi Standby.
Memahami Aplikasi Standby
Aplikasi Standby memungkinkan sistem menentukan bahwa aplikasi tidak ada aktivitas saat pengguna tidak menggunakannya secara aktif. Sistem membuat penentuan ini saat pengguna tidak menyentuh aplikasi selama jangka waktu tertentu dan tidak ada kondisi berikut yang berlaku:
- Pengguna secara eksplisit meluncurkan aplikasi.
- Aplikasi memiliki proses yang saat ini berada di latar depan, baik sebagai aktivitas atau layanan latar depan, atau sedang digunakan oleh aktivitas atau layanan latar depan lain.
- Aplikasi akan membuat notifikasi yang dilihat pengguna di layar kunci atau di baki notifikasi.
Saat pengguna mencolokkan perangkat ke catu daya, sistem akan melepaskan aplikasi dari status standby, sehingga aplikasi dapat mengakses jaringan dengan bebas dan menjalankan tugas serta sinkronisasi yang tertunda. Jika perangkat tidak ada aktivitas dalam waktu lama, sistem akan mengizinkan aplikasi yang tidak ada aktivitas mengakses jaringan sekitar sekali sehari.
Menggunakan FCM untuk berinteraksi dengan aplikasi Anda saat perangkat tidak ada aktivitas
Firebase Cloud Messaging (FCM) adalah layanan cloud-ke-perangkat yang memungkinkan Anda mendukung pengiriman pesan downstream real-time antara layanan backend dan aplikasi di perangkat Android. FCM menyediakan koneksi tunggal yang persisten ke cloud. Semua aplikasi yang memerlukan pesan real-time dapat berbagi koneksi ini. Koneksi bersama ini secara signifikan mengoptimalkan konsumsi baterai dengan membuat beberapa aplikasi tidak perlu mempertahankan koneksi persistennya sendiri yang terpisah, yang dapat menghabiskan baterai dengan cepat. Oleh karena itu, jika aplikasi Anda memerlukan integrasi pesan dengan layanan backend, sebaiknya gunakan FCM jika memungkinkan, daripada mempertahankan koneksi jaringan persisten Anda sendiri.
FCM dioptimalkan untuk berfungsi dengan mode tidak ada aktivitas Istirahatkan dan Aplikasi Standby. Jenis pesan RemoteNotification FCM memungkinkan Anda mengaktifkan aplikasi untuk berinteraksi dengan pengguna. Dalam
mode Istirahat atau Aplikasi Standby, sistem akan mengirimkan pesan dan memberi aplikasi
akses sementara ke layanan jaringan dan penguncian layar parsial, lalu mengembalikan
perangkat atau aplikasi ke status tidak ada aktivitas. Untuk notifikasi yang sensitif terhadap waktu dan terlihat oleh pengguna, pertimbangkan untuk menggunakan jenis pesan RemoteNotification guna mengaktifkan pengiriman dalam mode Istirahatkan. Pesan ini dapat menghasilkan notifikasi. Lihat
panduan FCM tentang RemoteNotification untuk mengetahui informasi selengkapnya.
Untuk pesan yang tidak menghasilkan notifikasi, seperti menjaga konten aplikasi tetap terbaru di latar belakang atau memulai sinkronisasi data, gunakan pesan FCM BackgroundSync. Pesan ini sengaja dibuat berprioritas rendah dan mungkin tertunda atau
dibatasi untuk mengoptimalkan baterai perangkat.
Sebagai praktik terbaik umum, jika aplikasi Anda memerlukan pesan downstream, gunakan FCM. Jika aplikasi Anda sudah menggunakan FCM, pastikan aplikasi tersebut menggunakan RemoteNotification
untuk pesan yang menghasilkan notifikasi yang ditampilkan kepada pengguna.
Jangan gunakan RemoteNotification untuk situasi berikut:
- Saat notifikasi pasti tidak akan ditampilkan.
- Untuk pengiriman pesan langsung yang hanya memperbarui status aplikasi, seperti menjaga konten aplikasi tetap terbaru di latar belakang atau memulai sinkronisasi data.
- Sebagai sarana untuk meminta pengguna akhir memberikan izin.
Dukungan untuk kasus penggunaan lainnya
Hampir semua aplikasi dapat mendukung mode Istirahatkan dengan mengelola konektivitas jaringan, alarm, tugas, dan sinkronisasi, serta dengan menggunakan pesan FCM. Untuk sekumpulan kasus penggunaan yang sempit, hal ini mungkin tidak cukup. Untuk kasus tersebut, sistem menyediakan daftar aplikasi yang dapat dikonfigurasi dan dikecualikan sebagian dari pengoptimalan Istirahatkan dan Aplikasi Standby.
Aplikasi yang dikecualikan sebagian dapat menggunakan jaringan dan mempertahankan penguncian layar saat aktif
parsial selama mode Istirahatkan dan Aplikasi Standby. Namun, batasan lain tetap berlaku
untuk aplikasi tersebut, sama seperti aplikasi lainnya. Misalnya, tugas dan sinkronisasi aplikasi ditangguhkan pada level API 23 dan yang lebih rendah, dan alarm AlarmManager regulernya tidak aktif. Aplikasi dapat memeriksa apakah aplikasi tersebut
saat ini ada dalam daftar pengecualian dengan memanggil
isIgnoringBatteryOptimizations().
Pengguna dapat mengonfigurasi daftar aplikasi yang dikecualikan secara manual di Setelan > Baterai > Pengoptimalan Baterai. Atau, sistem menyediakan cara bagi aplikasi untuk meminta pengguna mengecualikannya:
- Sebagian besar aplikasi dapat memanggil intent yang berisi
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. - Aplikasi yang memenuhi kasus penggunaan yang dapat diterima
dapat memanggil intent yang berisi
tindakan intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSuntuk memungkinkan pengguna menambahkan aplikasi ke daftar pengecualian secara langsung, tanpa membuka setelan sistem.
Aplikasi dapat memeriksa apakah aplikasi tersebut saat ini ada dalam daftar pengecualian dengan memanggil
isIgnoringBatteryOptimizations().
Menguji dengan Mode Istirahatkan dan Aplikasi Standby
Untuk membantu memastikan pengalaman yang luar biasa bagi pengguna, uji aplikasi Anda sepenuhnya dalam mode Istirahatkan dan Aplikasi Standby.
Menguji aplikasi Anda dengan mode Istirahatkan
Anda dapat menguji mode Istirahat dengan melakukan hal berikut:
- Konfigurasikan perangkat hardware atau perangkat virtual dengan image sistem Android 6.0 (API level 23) atau yang lebih tinggi.
- Hubungkan perangkat ke mesin development, lalu instal aplikasi Anda.
- Jalankan aplikasi dan biarkan aktif.
- Paksa sistem masuk ke mode nonaktif dengan menjalankan perintah berikut:
$ adb shell dumpsys deviceidle force-idle - Jika sudah siap, keluar dari mode nonaktif dengan menjalankan perintah berikut:
$ adb shell dumpsys deviceidle unforce - Aktifkan kembali perangkat dengan melakukan perintah berikut:
$ adb shell dumpsys battery reset - Perhatikan perilaku aplikasi Anda setelah mengaktifkan kembali perangkat. Pastikan aplikasi pulih dengan baik saat perangkat keluar dari mode Istirahatkan.
Menguji aplikasi Anda dengan Aplikasi Standby
Untuk menguji mode Aplikasi Standby dengan aplikasi Anda, lakukan hal berikut:
- Konfigurasikan perangkat hardware atau perangkat virtual dengan image sistem Android 6.0 (API level 23) atau yang lebih tinggi.
- Hubungkan perangkat ke mesin development, lalu instal aplikasi Anda.
- Jalankan aplikasi dan biarkan aktif.
- Paksa aplikasi ke mode Aplikasi Standby dengan menjalankan perintah berikut:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true - Simulasikan pengaktifan aplikasi menggunakan perintah berikut:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName> - Perhatikan perilaku aplikasi Anda setelah mengaktifkannya. Pastikan aplikasi pulih dengan baik dari mode standby. Secara khusus, periksa apakah notifikasi dan tugas latar belakang aplikasi Anda berfungsi seperti yang diharapkan.
Kasus penggunaan yang dapat diterima untuk pengecualian
Tabel berikut menyoroti beberapa kasus penggunaan dan apakah aplikasi dapat menggunakan tindakan intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS dalam situasi ini. Secara umum, aplikasi Anda tidak memenuhi
pengecualian ini kecuali jika mode Istirahat atau Aplikasi Standby merusak fungsi inti aplikasi atau
ada alasan teknis mengapa aplikasi Anda tidak dapat menggunakan pesan RemoteNotification
FCM.
Untuk mengetahui informasi selengkapnya, lihat Dukungan untuk kasus penggunaan lainnya.
| Jenis | Kasus penggunaan | Bisa menggunakan FCM? | Pengecualian dapat diterima? | Catatan |
|---|---|---|---|---|
| Instant messaging, chat, atau aplikasi telepon. | Memerlukan pengiriman pesan real-time kepada pengguna saat perangkat dalam mode Istirahatkan atau aplikasi dalam mode Aplikasi Standby. | Ya, menggunakan FCM | Tidak Dapat Diterima | Gunakan pesan FCM RemoteNotification untuk mengaktifkan aplikasi dan mengakses
jaringan. |
Ya, tetapi tidak menggunakan pesan RemoteNotification FCM. |
||||
| Aplikasi pesan instan, chat, atau panggilan; aplikasi VOIP perusahaan. | Tidak, tidak dapat menggunakan FCM karena dependensi teknis pada layanan pesan lain atau mode Istirahat dan Aplikasi Standby merusak fungsi inti aplikasi. | Dapat diterima | ||
| Aplikasi Keselamatan. | Aplikasi yang menjaga keamanan pengguna dan keluarga mereka. | Jika berlaku. | Dapat diterima | |
| Aplikasi otomatisasi tugas. | Fungsi inti aplikasi adalah menjadwalkan tindakan otomatis, seperti untuk pesan instan, panggilan suara, atau pengelolaan foto baru. | Jika berlaku. | Dapat diterima | |
| Aplikasi pendamping perangkat periferal. | Fungsi inti aplikasi adalah mempertahankan koneksi persisten dengan perangkat periferal untuk tujuan memberikan akses internet ke perangkat periferal. | Jika berlaku. | Dapat diterima | |
| Aplikasi hanya perlu terhubung ke perangkat periferal secara berkala untuk menyinkronkan, atau hanya perlu terhubung ke perangkat, seperti headphone nirkabel, yang terhubung melalui profil Bluetooth standar. | Jika berlaku. | Tidak bisa |