Android memiliki dua fitur penghematan daya yang memperpanjang masa pakai baterai untuk pengguna dengan mengelola cara aplikasi berperilaku saat perangkat tidak terhubung ke sumber daya: Istirahatkan dan Aplikasi Standby. Istirahatkan mengurangi konsumsi baterai dengan menunda aktivitas CPU dan jaringan latar belakang untuk aplikasi saat perangkat tidak digunakan dalam jangka waktu yang lama. Mode Aplikasi Standby menangguhkan aktivitas jaringan latar belakang untuk aplikasi yang tidak memiliki aktivitas pengguna terbaru.
Saat perangkat dalam mode Istirahat, akses aplikasi ke resource intensif baterai tertentu ditunda hingga masa pemeliharaan. Pembatasan spesifik tercantum dalam Pembatasan pengelolaan daya.
Mode Istirahatkan 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 atau tidak. Untuk membantu memastikan pengalaman terbaik bagi pengguna, uji aplikasi Anda dalam mode Istirahatkan dan Aplikasi Siaga, lalu lakukan semua penyesuaian yang diperlukan untuk kode Anda. Bagian berikut memberikan detail.
Memahami Mode Istirahatkan
Jika pengguna membiarkan perangkat tidak terhubung dan tidak bergerak selama jangka waktu tertentu, dengan layar mati, perangkat akan memasuki mode Istirahatkan. Dalam mode Istirahatkan, sistem mencoba menghemat baterai dengan membatasi akses aplikasi ke layanan jaringan dan intensif CPU. Mode ini juga mencegah aplikasi mengakses jaringan dan menunda tugas, sinkronisasi, dan alarm standar.
Secara berkala, sistem keluar dari mode Istirahatkan sesaat untuk membiarkan aplikasi menyelesaikan aktivitas yang ditangguhkan. Selama masa pemeliharaan ini, sistem akan menjalankan semua sinkronisasi, tugas, serta alarm yang tertunda, dan memungkinkan aplikasi mengakses jaringan.
Setelah masa pemeliharaan berakhir, sistem kembali akan memasuki Istirahatkan, menangguhkan akses jaringan dan menunda tugas, sinkronisasi, dan alarm. Seiring waktu, sistem menjadwalkan masa pemeliharaan lebih jarang, sehingga membantu mengurangi konsumsi baterai jika tidak aktif lebih lama saat perangkat tidak mengisi daya.
Saat pengguna membangunkan perangkat dengan memindahkannya, mengaktifkan layar, atau menghubungkan pengisi daya, sistem akan keluar dari mode Istirahatkan dan semua aplikasi melanjutkan aktivitas normal.
Pembatasan Mode Istirahatkan
Sistem menerapkan pembatasan berikut untuk aplikasi Anda saat berada dalam Istirahatkan:
- Menangguhkan akses jaringan.
- Mengabaikan penguncian layar saat aktif.
- Menunda alarm
AlarmManager
standar, termasuksetExact()
dansetWindow()
, ke masa pemeliharaan berikutnya.- Jika Anda perlu menyetel alarm yang berbunyi saat berada dalam mode Istirahatkan, gunakan
setAndAllowWhileIdle()
atausetExactAndAllowWhileIdle()
. - Alarm yang disetel dengan
setAlarmClock()
akan terus berbunyi seperti biasa. Sistem akan keluar dari mode Istirahatkan sesaat sebelum alarm tersebut berbunyi.
- Jika Anda perlu menyetel alarm yang berbunyi saat berada dalam mode Istirahatkan, gunakan
- Tidak melakukan pemindaian Wi-Fi.
- Tidak mengizinkan adaptor sinkronisasi berjalan.
- Tidak mengizinkan
JobScheduler
berjalan.
Checklist mode Istirahatkan
- Jika memungkinkan, gunakan Firebase Cloud Messaging (FCM) untuk pesan downstream.
- Jika pengguna Anda perlu segera melihat notifikasi, gunakan pesan prioritas tinggi FCM. Hanya gunakan prioritas tinggi untuk pesan yang menghasilkan notifikasi. Untuk panduan selengkapnya, baca dokumentasi FCM tentang prioritas pesan untuk Android.
- Sediakan informasi yang cukup dalam payload pesan awal sehingga akses jaringan berikutnya tidak diperlukan.
- Tetapkan alarm penting dengan
setAndAllowWhileIdle()
dansetExactAndAllowWhileIdle()
. - Uji aplikasi Anda dalam mode Istirahatkan.
Menyesuaikan aplikasi Anda dengan mode Istirahatkan
Mode Istirahatkan dapat memengaruhi aplikasi secara berbeda, bergantung pada kemampuan yang ditawarkan dan layanan yang digunakan. Banyak aplikasi berfungsi secara normal di sepanjang siklus Istirahatkan 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 bisa menyetel alarm
yang menyala meskipun perangkat dalam mode Istirahatkan.
Pembatasan mode Istirahatkan pada akses jaringan juga kemungkinan akan memengaruhi aplikasi Anda, terutama jika aplikasi bergantung pada 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 berperilaku seperti yang diharapkan dengan fitur Istirahatkan, Anda dapat menggunakan
perintah adb
untuk memaksa sistem masuk dan keluar dari mode Istirahatkan dan
mengamati perilaku aplikasi. Untuk mengetahui detailnya, lihat
Menguji dengan Mode Istirahatkan dan Aplikasi Standby.
Memahami Aplikasi Standby
Aplikasi Standby memungkinkan sistem menentukan apakah aplikasi sedang tidak ada aktivitas ketika pengguna tidak aktif menggunakannya. Sistem menentukan hal ini jika pengguna tidak menyentuh aplikasi selama jangka waktu tertentu dan tidak satu pun kondisi berikut yang berlaku:
- Pengguna secara eksplisit meluncurkan aplikasi.
- Aplikasi memiliki proses yang sedang berlangsung di latar depan, baik sebagai aktivitas atau layanan latar depan, atau sedang digunakan oleh aktivitas atau layanan latar depan lain.
- Aplikasi menghasilkan notifikasi yang dilihat pengguna di layar kunci atau di baki notifikasi.
Saat pengguna mencolokkan perangkat ke catu daya, sistem akan merilis aplikasi dari status standby, sehingga memungkinkannya untuk bebas mengakses jaringan dan menjalankan tugas dan sinkronisasi yang tertunda. Jika perangkat tidak ada aktivitas dalam jangka waktu yang lama, sistem akan mengizinkan akses jaringan aplikasi yang tidak ada aktivitas sekitar sekali sehari.
Menggunakan FCM untuk berinteraksi dengan aplikasi Anda saat perangkat tidak digunakan
Firebase Cloud Messaging (FCM) adalah layanan cloud-ke-perangkat yang memungkinkan Anda mendukung pesan downstream real-time antara layanan backend dan aplikasi di perangkat Android. FCM menyediakan satu koneksi persisten ke cloud. Semua aplikasi yang memerlukan pesan real-time dapat membagikan koneksi ini. Koneksi bersama ini mengoptimalkan penggunaan baterai secara signifikan dengan menjadikannya tidak diperlukan untuk beberapa aplikasi dalam mempertahankan koneksi persisten terpisah mereka sendiri, yang dapat menguras 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 nonaktif Istirahatkan dan Aplikasi Standby. Pesan FCM prioritas tinggi memungkinkan Anda mengaktifkan aplikasi untuk berinteraksi dengan pengguna. Dalam mode Istirahatkan atau Aplikasi Standby, sistem mengirim pesan dan memberi aplikasi akses sementara ke layanan jaringan dan penguncian layar saat aktif sebagian, lalu mengembalikan perangkat atau aplikasi ke status nonaktif. Untuk notifikasi yang terlihat oleh pengguna dan mendesak, pertimbangkan untuk menggunakan pesan prioritas tinggi guna mengaktifkan pengiriman dalam mode Istirahatkan. Pesan prioritas tinggi dapat menghasilkan notifikasi. Lihat panduan FCM tentang pesan berprioritas tinggi untuk mengetahui informasi selengkapnya.
Untuk pesan yang tidak menghasilkan notifikasi, seperti menjaga konten aplikasi selalu terbaru di latar belakang atau memulai sinkronisasi data, gunakan pesan FCM prioritas normal. Pesan berprioritas normal segera dikirim jika perangkat tidak dalam mode Istirahat. Jika perangkat dalam mode Istirahat, notifikasi akan dikirim selama periode pemeliharaan Istirahat berkala atau segera setelah pengguna mengaktifkan perangkat.
Sebagai praktik terbaik umum, jika aplikasi Anda memerlukan pengiriman pesan downstream, gunakan FCM. Jika aplikasi Anda sudah menggunakan FCM, pastikan aplikasi tersebut menggunakan pesan berprioritas tinggi hanya untuk pesan yang menghasilkan notifikasi yang ditampilkan kepada pengguna.
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 sejumlah kecil kasus penggunaan, data ini mungkin tidak cukup. Untuk kasus semacam itu, sistem menyediakan daftar aplikasi yang dapat dikonfigurasi yang sebagian dikecualikan dari pengoptimalan Istirahatkan dan Aplikasi Standby.
Aplikasi yang dikecualikan sebagian dapat menggunakan jaringan dan menahan penguncian layar saat aktif
parsial selama mode Istirahatkan dan Aplikasi Standby. Namun, pembatasan lain tetap berlaku
untuk aplikasi, seperti yang berlaku untuk aplikasi lain. Misalnya, tugas dan sinkronisasi aplikasi
ditangguhkan pada API level 23 dan yang lebih lama, dan alarm
AlarmManager
regulernya tidak berbunyi. Aplikasi dapat memeriksa apakah
saat ini berada dalam daftar pengecualian dengan memanggil
isIgnoringBatteryOptimizations()
.
Pengguna dapat mengonfigurasi daftar aplikasi yang dikecualikan secara manual di Settings > Battery > Battery Optimization. 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_OPTIMIZATIONS
agar pengguna dapat langsung menambahkan aplikasi ke daftar pengecualian, tanpa membuka setelan sistem.
Aplikasi dapat memeriksa apakah saat ini ada dalam daftar pengecualian dengan memanggil
isIgnoringBatteryOptimizations()
.
Menguji dengan Istirahatkan dan Aplikasi Standby
Untuk membantu memastikan pengalaman yang baik bagi pengguna, uji aplikasi Anda sepenuhnya dalam mode Istirahatkan dan Aplikasi Standby.
Menguji aplikasi dengan Istirahatkan
Anda dapat menguji mode Istirahatkan dengan melakukan hal berikut:
- Konfigurasikan hardware atau perangkat virtual dengan Android 6.0 (API level 23) atau image sistem yang lebih tinggi.
- Hubungkan perangkat ke mesin development lalu pasang aplikasi Anda.
- Jalankan aplikasi Anda 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 menjalankan 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 dengan Aplikasi Standby
Untuk menguji mode Aplikasi Standby dengan aplikasi Anda, lakukan hal berikut:
- Konfigurasikan perangkat keras atau perangkat virtual dengan Android 6.0 (API level 23) atau image sistem yang lebih tinggi.
- Hubungkan perangkat ke mesin development lalu pasang aplikasi Anda.
- Jalankan aplikasi Anda 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 Istirahatkan atau Aplikasi Standby memutus fungsi inti aplikasi atau
ada alasan teknis mengapa aplikasi Anda tidak dapat menggunakan pesan prioritas tinggi 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 berada dalam mode Istirahatkan atau aplikasi dalam mode Aplikasi Standby. | Ya, menggunakan FCM | Tidak bisa | Gunakan pesan prioritas tinggi FCM untuk mengaktifkan aplikasi dan mengakses jaringan. |
Ya, tetapi tidak menggunakan pesan prioritas tinggi FCM. | ||||
Instant messaging, chat, atau aplikasi telepon; aplikasi VOIP perusahaan. | Tidak, FCM tidak dapat digunakan karena adanya dependensi teknis pada layanan pesan lain atau mode Istirahatkan dan Aplikasi Standby merusak fungsi inti aplikasi. | Dapat diterima | ||
Aplikasi Keselamatan. | Aplikasi yang menjaga keamanan pengguna dan keluarganya. | Jika berlaku. | Dapat diterima | |
Aplikasi otomatisasi tugas. | Fungsi inti aplikasi menjadwalkan tindakan otomatis, seperti untuk fitur 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 menyediakan akses internet perangkat periferal. | Jika berlaku. | Dapat diterima | |
Aplikasi hanya perlu terhubung ke perangkat periferal secara berkala untuk sinkronisasi, atau hanya perlu terhubung ke perangkat, seperti headphone nirkabel, yang terhubung melalui profil Bluetooth standar. | Jika berlaku. | Tidak bisa |