Jika aplikasi menargetkan Android 11 (level API 30) atau lebih tinggi, dan pengguna tidak berinteraksi dengan aplikasi selama beberapa bulan, sistem akan menempatkan aplikasi di status hibernasi. Sistem mengoptimalkan ruang penyimpanan, bukan performa, dan melindungi data pengguna. Perilaku sistem ini mirip dengan yang terjadi saat pengguna memaksa aplikasi berhenti secara manual dari setelan sistem.
Efek hibernasi
Seperti yang ditunjukkan dalam tabel 1, efek hibernasi bergantung pada versi SDK target aplikasi, serta perangkat tempat aplikasi berjalan:
Versi SDK target | Karakteristik perangkat | Efek hibernasi |
---|---|---|
Android 12 atau yang lebih baru | Menjalankan Android 12 atau versi yang lebih baru |
Izin runtime aplikasi Anda akan direset. Tindakan ini memiliki efek yang sama seperti jika pengguna melihat izin dalam setelan sistem dan mengubah tingkat akses aplikasi Anda menjadi Deny. Aplikasi tidak dapat menjalankan tugas atau pemberitahuan dari latar belakang. Aplikasi tidak dapat menerima notifikasi push, termasuk pesan berprioritas tinggi yang dikirim melalui Firebase Cloud Messaging. Semua file di cache aplikasi akan dihapus. |
Android 11 | Menjalankan Android 11 | Izin runtime aplikasi Anda direset. |
Android 11 | Menjalankan Android 6.0 (level API 23) hingga Android 10 (level API 29), inklusif, dan didukung oleh layanan Google Play |
Izin runtime aplikasi Anda direset. Perilaku ini berlaku pada Desember 2021. Pelajari lebih lanjut di postingan blog ini tentang membuat reset otomatis izin tersedia untuk miliaran perangkat lainnya. |
Perilaku sistem saat aplikasi keluar dari hibernasi
Ketika pengguna selanjutnya berinteraksi dengan aplikasi, aplikasi akan keluar dari hibernasi dan dapat membuat tugas, pemberitahuan, serta notifikasi lagi.
Namun, sistem tidak melakukan hal berikut untuk aplikasi Anda:
Memberikan kembali izin runtime aplikasi Anda.
Pengguna harus memberikan kembali izin ini untuk aplikasi Anda.
Menjadwalkan ulang tugas, pemberitahuan, dan notifikasi apa pun yang dijadwalkan sebelum aplikasi Anda mengalami hibernasi.
Untuk mendukung alur kerja ini dengan lebih mudah, gunakan WorkManager. Anda juga dapat menambahkan logika penjadwalan ulang di penerima siaran
ACTION_BOOT_COMPLETED
yang dipanggil saat aplikasi keluar dari hibernasi dan setelah perangkat melakukan booting.
Penggunaan aplikasi
Bagian berikut memberikan contoh penggunaan aplikasi, serta contoh tindakan yang tidak dianggap sistem sebagai penggunaan aplikasi.
Contoh penggunaan aplikasi
Saat aktivitas di aplikasi Anda dilanjutkan, sistem menganggap peristiwa ini sebagai interaksi pengguna. Oleh karena itu, sistem memperpanjang jumlah waktu sebelum aplikasi Anda memasuki hibernasi.
Di Android 11 dan yang lebih tinggi, perilaku berikut juga dianggap sebagai interaksi pengguna:
- Pengguna berinteraksi dengan widget.
Pengguna berinteraksi dengan notifikasi, kecuali untuk menutup notifikasi.
Perlu dicatat bahwa penggunaan aplikasi untuk hibernasi tidak secara eksplisit memerlukan interaksi pengguna. Selama komponen paket dipanggil, aktivitas tersebut akan tetap dianggap sebagai penggunaan aplikasi. Beberapa contohnya antara lain:
- Aplikasi yang memiliki layanan atau penyedia konten yang dibatasi oleh aplikasi lain di perangkat atau OS. Misalnya, Editor Metode Input (IME) atau pengelola sandi.
Penerima siaran dalam paket yang menerima siaran eksplisit dari paket eksternal.
Non-contoh
Jika aplikasi Anda hanya menampilkan perilaku yang dijelaskan dalam daftar berikut, aplikasi Anda akan memasuki hibernasi setelah beberapa bulan:
- Menjalankan tugas terjadwal menggunakan
JobScheduler
. - Menerima siaran implisit.
- Menjadwalkan alarm.
Pengecualian sistem dari hibernasi
Android memberikan pengecualian tingkat sistem dari hibernasi aplikasi dalam kasus penggunaan tertentu. Jika termasuk dalam kategori berikut, aplikasi Anda akan dikecualikan dari standar penggunaan aplikasi dan tidak akan melakukan hibernasi.
- Aplikasi yang tidak ditampilkan di peluncur
- Aplikasi apa pun yang tidak memiliki kotak pintasan aktif pada peluncur.
- Aplikasi profil kerja
- Semua aplikasi yang diinstal pengguna di profil kerja. Perhatikan bahwa jika aplikasi yang sama juga berada di profil pribadi, hanya aplikasi profil kerja yang dikecualikan.
- Pengontrol kebijakan perangkat
- Aplikasi yang mengontrol kebijakan perangkat lokal dan aplikasi sistem di perangkat.
- Aplikasi dengan hak istimewa operator
- Aplikasi apa pun yang dimuat sebelumnya oleh operator ponsel di perangkat dan dianggap perlu untuk kewajiban layanan kontrak, misalnya, pesan suara atau aplikasi layanan pelanggan.
- Aplikasi penginstal 3p
- App store pihak ketiga yang memberikan update otomatis untuk aplikasi terinstal jika diperlukan.
Pengecualian pengguna dari hibernasi
Jika Anda mengantisipasi bahwa kasus penggunaan inti di aplikasi terpengaruh oleh hibernasi, Anda dapat meminta pengecualian dari hibernasi aplikasi dari pengguna. Pengecualian ini berguna untuk situasi saat pengguna mengharapkan aplikasi Anda berfungsi terutama di latar belakang, bahkan tanpa pengguna berinteraksi dengan aplikasi Anda, seperti saat aplikasi Anda melakukan salah satu hal berikut:
- Memberikan keamanan bagi keluarga dengan melaporkan lokasi anggota keluarga secara berkala.
- Menyinkronkan data antara perangkat dan server aplikasi Anda.
- Berkomunikasi dengan perangkat smart, seperti TV.
- Menyambungkan ke perangkat pendamping, seperti smartwatch.
Untuk meminta pengecualian, selesaikan langkah-langkah di bagian berikut ini.
Memeriksa apakah pengguna sudah menonaktifkan hibernasi untuk aplikasi Anda
Untuk memeriksa apakah pengguna sudah menonaktifkan hibernasi untuk aplikasi Anda,
gunakan getUnusedAppRestrictionsStatus()
API.
Untuk mengetahui detail tambahan tentang cara menggunakan API ini di aplikasi Anda, lihat contoh kode API di halaman ini.
Meminta pengguna untuk menonaktifkan hibernasi untuk aplikasi
Jika pengguna belum menonaktifkan hibernasi untuk aplikasi, Anda dapat mengirim permintaan ke pengguna. Untuk melakukannya, selesaikan langkah-langkah berikut:
- Tampilkan UI yang menjelaskan kepada pengguna mengapa mereka perlu menonaktifkan hibernasi untuk aplikasi Anda.
-
Panggil
createManageUnusedAppRestrictionsIntent()
API, seperti yang ditunjukkan dalam contoh kode API. API ini membuat intent yang memuat layar Info aplikasi di Setelan. Dari sini, pengguna dapat menonaktifkan hibernasi untuk aplikasi Anda.Anda harus memanggil
startActivityForResult()
, bukanstartActivity()
saat mengirim intent ini.Seperti yang ditunjukkan dalam tabel 2, lokasi dan nama opsi bergantung pada karakteristik perangkat tempat aplikasi Anda diinstal:
Tabel 2. Opsi yang menonaktifkan hibernasi untuk aplikasi Anda Karakteristik perangkat Halaman tempat opsi muncul Nama opsi yang akan dinonaktifkan Menjalankan Android 13 atau versi yang lebih baru Info aplikasi Jeda aktivitas aplikasi jika tak dipakai Menjalankan Android 12 Info aplikasi Hapus izin & kosongkan ruang penyimpanan Menjalankan Android 11 Info aplikasi > Izin Hapus izin jika aplikasi tidak digunakan Menjalankan Android 6.0 hingga Android 10, inklusif, dan didukung oleh layanan Google Play Aplikasi Play > Menu > Play Protect > Izin untuk Aplikasi yang Tidak Digunakan Hapus izin jika aplikasi tidak digunakan
Contoh kode API
Contoh kode ini menunjukkan cara memeriksa apakah hibernasi diaktifkan untuk aplikasi Anda dan cara yang benar untuk meminta pengguna menonaktifkan hibernasi untuk aplikasi Anda.
Kotlin
val future: ListenableFuture<Int> = PackageManagerCompat.getUnusedAppRestrictionsStatus(context) future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context)) fun onResult(appRestrictionsStatus: Int) { when (appRestrictionsStatus) { // Couldn't fetch status. Check logs for details. ERROR -> { } // Restrictions don't apply to your app on this device. FEATURE_NOT_AVAILABLE -> { } // The user has disabled restrictions for your app. DISABLED -> { } // If the user doesn't start your app for a few months, the system will // place restrictions on it. See the API_* constants for details. API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus) } } fun handleRestrictions(appRestrictionsStatus: Int) { // If your app works primarily in the background, you can ask the user // to disable these restrictions. Check if you have already asked the // user to disable these restrictions. If not, you can show a message to // the user explaining why permission auto-reset or app hibernation should be // disabled. Then, redirect the user to the page in system settings where they // can disable the feature. val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName) // You must use startActivityForResult(), not startActivity(), even if // you don't use the result code returned in onActivityResult(). startActivityForResult(intent, REQUEST_CODE) }
API platform lama
Sistem operasi juga menyertakan API untuk berinteraksi dengan fitur hibernasi. Namun, API tersebut hanya berfungsi pada perangkat yang menjalankan Android 11 atau yang lebih tinggi, dan tidak menangani fitur hibernasi yang di-backport ke versi Android sebelumnya. Oleh karena itu, kami tidak merekomendasikan penggunaan API tersebut.
Jika Anda perlu terus menggunakan API tersebut untuk sementara demi kompatibilitas, daftar berikut menunjukkan cara menggunakannya:
- Untuk memeriksa apakah hibernasi dinonaktifkan untuk aplikasi Anda:
isAutoRevokeWhitelisted()
- Untuk mengirim pengguna ke halaman setelan hibernasi: buat Intent menggunakan
ACTION_APPLICATION_DETAILS_SETTINGS
Memanggil perilaku hibernasi secara manual
Untuk menguji perilaku aplikasi setelah sistem menempatkan aplikasi dalam status hibernasi, selesaikan langkah-langkah berikut:
(Khusus Android 12 dan yang lebih baru) Aktifkan perilaku hibernasi di perangkat Anda:
adb shell device_config put app_hibernation app_hibernation_enabled true
Tetapkan jumlah waktu tunggu default yang dibutuhkan sistem untuk memasuki hibernasi. Dengan demikian, Anda dapat memulihkannya setelah pengujian:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Kurangi jumlah waktu tunggu yang dibutuhkan sistem. Pada contoh berikut, sistem dimodifikasi sehingga aplikasi Anda hanya memasuki hibernasi satu detik setelah Anda berhenti berinteraksi dengan aplikasi:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Tunggu siaran boot-time selesai di perangkat uji dengan menjalankan perintah berikut:
adb shell am wait-for-broadcast-idle
Setelah siaran selesai, perintah ini akan menampilkan pesan:
All broadcast queues are idle!
Panggil proses hibernasi aplikasi secara manual:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(Khusus Android 12 dan yang lebih baru) Pastikan aplikasi memiliki status hibernasi menggunakan salah satu metode berikut:
- Perhatikan bahwa perangkat pengujian sekarang menampilkan notifikasi, yang menunjukkan bahwa aplikasi yang tidak digunakan mengalami hibernasi.
Jalankan perintah berikut:
adb shell cmd app_hibernation get-state PACKAGE-NAME
Pulihkan jumlah waktu tunggu default yang dibutuhkan sistem sebelum menempatkan aplikasi Anda ke dalam hibernasi:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold