Mengoptimalkan aplikasi untuk mode Istirahatkan dan Aplikasi Standby

Android memiliki dua fitur hemat daya yang memperpanjang masa pakai baterai bagi pengguna dengan mengelola cara aplikasi berperilaku saat perangkat tidak terhubung ke sumber daya: Istirahatkan dan Aplikasi Standby. Istirahatkan mengurangi konsumsi baterai dengan menunda CPU latar belakang dan aktivitas jaringan untuk aplikasi saat perangkat tidak digunakan untuk jangka waktu lama. Aplikasi Standby menangguhkan aktivitas jaringan di latar belakang untuk aplikasi yang tidak memiliki aktivitas pengguna terbaru.

Saat perangkat dalam mode Istirahat, akses aplikasi ke resource intensif baterai tertentu akan 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 penyesuaian yang diperlukan pada kode Anda. Bagian berikut memberikan detailnya.

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 memungkinkan aplikasi menyelesaikan aktivitas yang ditangguhkan. Selama masa pemeliharaan ini, sistem akan menjalankan semua sinkronisasi, tugas, serta alarm yang tertunda, dan memungkinkan aplikasi mengakses jaringan.

Gambar 1. Mode Istirahatkan menyediakan masa pemeliharaan berulang bagi aplikasi untuk menggunakan jaringan dan menangani aktivitas yang tertunda.

Saat masa pemeliharaan berakhir, sistem kembali memasuki mode Istirahatkan, menangguhkan akses jaringan dan menunda tugas, sinkronisasi, serta alarm. Seiring waktu, sistem menjadwalkan masa pemeliharaan lebih jarang, sehingga membantu mengurangi penggunaan baterai jika tidak aktif lebih lama ketika perangkat tidak sedang mengisi daya.

Jika pengguna mengaktifkan perangkat dengan memindahkannya, menyalakan layar, atau menghubungkan pengisi daya, sistem akan keluar dari mode Istirahatkan dan semua aplikasi melanjutkan aktivitas normal.

Pembatasan Mode Istirahatkan

Sistem menerapkan pembatasan berikut pada aplikasi Anda saat berada dalam mode Istirahatkan:

Checklist 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 masing-masing masa pemeliharaan.

Untuk membantu penjadwalan alarm, Anda dapat menggunakan dua metode AlarmManager: setAndAllowWhileIdle() dan setExactAndAllowWhileIdle(). Dengan metode ini, Anda dapat 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 mode 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 tidak ada aktivitas saat pengguna tidak aktif menggunakannya. Sistem menentukan hal 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 sedang berada 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 melepaskan aplikasi dari status standby sehingga memungkinkan aplikasi dengan bebas mengakses jaringan serta menjalankan tugas dan sinkronisasi yang tertunda. Jika perangkat tidak ada aktivitas dalam jangka waktu yang lama, sistem memungkinkan akses jaringan aplikasi yang sedang tidak aktif dalam sehari.

Menggunakan FCM untuk berinteraksi dengan aplikasi Anda saat perangkat tidak ada aktivitas

Firebase Cloud Messaging (FCM) adalah layanan cloud-ke-perangkat yang dapat Anda gunakan untuk mendukung pengiriman 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 secara signifikan mengoptimalkan konsumsi baterai dengan membuatnya tidak diperlukan bagi beberapa aplikasi untuk mempertahankan koneksi persisten terpisah mereka sendiri, yang dapat menguras baterai secara cepat. Oleh karena itu, jika aplikasi Anda memerlukan integrasi pesan dengan layanan backend, sebaiknya gunakan FCM jika memungkinkan, daripada mempertahankan koneksi jaringan persisten Anda.

FCM dioptimalkan untuk berfungsi dengan mode tidak ada aktivitas dari Istirahatkan dan Aplikasi Standby. Dengan pesan prioritas tinggi FCM, Anda dapat mengaktifkan aplikasi untuk berinteraksi dengan pengguna. Dalam mode Istirahatkan atau Aplikasi Standby, sistem akan mengirimkan pesan dan memberi aplikasi akses sementara ke layanan jaringan dan penguncian layar saat aktif parsial, lalu mengembalikan perangkat atau aplikasi ke status tidak ada aktivitas. Untuk notifikasi yang mendesak dan terlihat oleh pengguna, pertimbangkan untuk menggunakan pesan prioritas tinggi guna mengaktifkan pengiriman dalam mode Istirahat. Pesan berprioritas tinggi dapat menghasilkan notifikasi. Lihat panduan FCM tentang pesan berprioritas tinggi untuk mengetahui informasi selengkapnya.

Untuk pesan yang tidak mengakibatkan notifikasi, misalnya memperbarui konten aplikasi di latar belakang atau memulai sinkronisasi data, gunakan pesan FCM prioritas normal. Pesan berprioritas normal segera dikirim jika perangkat tidak dalam mode Istirahatkan. Jika perangkat berada dalam mode Istirahat, perangkat akan dikirimkan selama masa pemeliharaan Istirahatkan secara berkala atau segera setelah pengguna membangunkan 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 fitur Istirahatkan dengan mengelola konektivitas jaringan, alarm, tugas, dan sinkronisasi, serta dengan menggunakan pesan FCM. Untuk sejumlah kecil kasus penggunaan, hal ini mungkin tidak cukup. Untuk kasus semacam itu, sistem menyediakan daftar aplikasi yang dapat dikonfigurasi yang sebagian dikecualikan dari pengoptimalan Istirahat 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 masih berlaku untuk aplikasi tersebut, 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 di daftar pengecualian dengan memanggil isIgnoringBatteryOptimizations().

Pengguna dapat secara manual mengonfigurasi daftar aplikasi yang dikecualikan di Settings > Battery > Battery Optimization. Atau, sistem menyediakan cara bagi aplikasi untuk meminta pengguna mengecualikannya:

Aplikasi dapat memeriksa apakah saat ini berada dalam daftar pengecualian dengan memanggil isIgnoringBatteryOptimizations().

Menguji dengan fitur 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 dengan Istirahatkan

Anda dapat menguji mode Istirahatkan dengan melakukan hal berikut:

  1. Konfigurasikan hardware atau perangkat virtual dengan Android 6.0 (API level 23) atau image sistem yang lebih tinggi.
  2. Hubungkan perangkat ke mesin development lalu pasang aplikasi Anda.
  3. Jalankan aplikasi Anda dan biarkan aktif.
  4. Paksa sistem masuk ke mode tidak ada aktivitas dengan menjalankan perintah berikut:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Jika sudah siap, keluar dari mode tidak ada aktivitas dengan menjalankan perintah berikut:
        $ adb shell dumpsys deviceidle unforce
        
  6. Aktifkan kembali perangkat dengan melakukan perintah berikut:
        $ adb shell dumpsys battery reset
        
  7. 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:

  1. Konfigurasikan hardware atau perangkat virtual dengan Android 6.0 (API level 23) atau image sistem yang lebih tinggi.
  2. Hubungkan perangkat ke mesin development lalu pasang aplikasi Anda.
  3. Jalankan aplikasi Anda dan biarkan aktif.
  4. Paksa aplikasi ke mode Aplikasi Standby dengan menjalankan perintah berikut:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Simulasikan pengaktifan aplikasi menggunakan perintah berikut:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Perhatikan perilaku aplikasi Anda setelah mengaktifkannya. Pastikan aplikasi pulih dengan baik dari mode standby. Secara khusus, periksa apakah notifikasi aplikasi dan tugas latar belakang 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 fitur Istirahatkan atau Aplikasi Standby memutus fungsi inti aplikasi atau ada alasan teknis mengapa aplikasi Anda tidak dapat menggunakan pesan berprioritas 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 ke 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 panggilan; aplikasi VOIP perusahaan. Tidak, tidak dapat menggunakan FCM karena ketergantungan teknis pada layanan pesan lain, atau fitur 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 instant messaging, 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 menyinkronkan, atau hanya perlu terhubung ke perangkat, seperti headphone nirkabel, yang terhubung melalui profil Bluetooth standar. Jika berlaku. Tidak bisa