Bersiaplah untuk menggunakan 12L, yaitu update fitur baru untuk perangkat layar besar yang akan hadir awal tahun depan. Coba sekarang juga!

Pembatasan peluncuran layanan latar depan

Aplikasi yang menarget Android 12 tidak dapat lagi memulai layanan latar depan saat berjalan di latar belakang, kecuali untuk beberapa kasus khusus. Jika aplikasi mencoba memulai layanan latar depan saat aplikasi berjalan di latar belakang, dan layanan latar depan tersebut bukan merupakan kasus khusus, sistem akan menampilkan ForegroundServiceStartNotAllowedException.

Jika aplikasi Anda terpengaruh oleh perubahan ini, beralihlah menggunakan WorkManager. WorkManager adalah solusi yang direkomendasikan untuk memulai tugas latar belakang dengan prioritas lebih tinggi.

Mulai WorkManager 2.7.0, aplikasi dapat memanggil setExpedited() untuk mendeklarasikan bahwa Worker harus menggunakan tugas yang diprioritaskan. API baru ini menggunakan tugas yang diprioritaskan saat dijalankan di Android 12, dan API tersebut menggunakan layanan latar depan pada versi Android sebelumnya untuk memberikan kompatibilitas mundur.

Cuplikan kode berikut menunjukkan contoh cara menggunakan metode setExpedited():

Kotlin

OneTimeWorkRequestBuilder<T>().apply {
    setInputData(inputData)
    setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
}.build()

Java

OneTimeWorkRequest request = new OneTimeWorkRequestBuilder<T>()
    .setInputData(inputData)
    .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
    .build();

Karena metode CoroutineWorker.setForeground() dan ListenableWorker.setForegroundAsync() didukung oleh layanan latar depan, keduanya tunduk pada pengecualian dan pembatasan peluncuran layanan latar depan yang sama. Anda dapat menggunakan API secara coba-coba, tetapi bersiaplah untuk menangani pengecualian jika sistem tidak mengizinkan aplikasi Anda memulai layanan latar depan. Untuk mendapatkan pengalaman yang lebih konsisten, gunakan setExpedited().

Untuk melihat contoh lengkap tentang cara WorkManager 2.7.0 menggunakan tugas yang diprioritaskan, lihat WorkManagerSample di GitHub.

Tugas yang diprioritaskan

Hal baru di Android 12, tugas yang diprioritaskan memungkinkan aplikasi menjalankan tugas singkat yang penting sekaligus memberi sistem kontrol yang lebih besar atas akses ke resource. Tugas ini memiliki serangkaian karakteristik di antara layanan latar depan dan tugas JobScheduler biasa:

  • Tugas ini ditujukan untuk tugas singkat yang dapat selesai dalam beberapa menit. Kecuali jika aplikasi memiliki kuota yang cukup, sistem mungkin akan menghentikan tugas yang diprioritaskan jika tugas sudah berjalan setidaknya selama 3 menit.
  • Tugas ini tidak terlalu terpengaruh oleh beberapa pembatasan pengelolaan daya sistem, seperti fitur Penghemat Baterai dan Istirahatkan.
  • Sistem akan segera menjalankannya, dengan ketentuan bahwa beban kerja sistem saat ini memungkinkan untuk melakukannya.

Tugas yang diprioritaskan mungkin ditangguhkan

Sistem akan mencoba mengeksekusi suatu tugas yang diprioritaskan sesegera mungkin setelah tugas tersebut dipanggil. Namun, seperti halnya dengan jenis tugas lain, sistem dapat menunda permulaan tugas baru yang diprioritaskan, seperti dalam kasus berikut:

  • Beban sistem terlalu tinggi, yang dapat terjadi jika terlalu banyak tugas yang sudah berjalan, atau saat sistem tidak memiliki cukup memori.
  • Batas kuota tugas yang diprioritaskan telah terlampaui. Tugas yang diprioritaskan menggunakan sistem kuota yang didasarkan pada Bucket Aplikasi Standby dan membatasi waktu eksekusi maksimum dalam jendela waktu yang bergulir. Kuota yang digunakan untuk tugas yang diprioritaskan lebih ketat dibandingkan kuota yang digunakan untuk jenis tugas latar belakang lainnya.

Efek pada API Alarm Manager

Secara umum, aplikasi yang menarget Android 12 tidak dapat memulai layanan latar depan menggunakan alarm.

Untuk mendukung kasus penggunaan saat aplikasi perlu mengirim alarm atau pengingat yang sensitif terhadap waktu kepada pengguna, Anda masih dapat memulai layanan latar depan saat alarm yang tepat berbunyi. Untuk menyetel alarm yang tepat, aplikasi Anda harus mendeklarasikan izin SCHEDULE_EXACT_ALARM.

Pelajari izin alarm yang tepat lebih lanjut.

Kasus yang mengizinkan layanan latar depan diluncurkan dari latar belakang

Dalam situasi berikut, aplikasi Anda dapat memulai layanan latar depan bahkan saat aplikasi berjalan di latar belakang: