Menjadwalkan alarm yang tepat ditolak secara default

Alarm yang tepat dimaksudkan untuk notifikasi atau tindakan yang diinginkan pengguna yang perlu dilakukan pada waktu yang tepat.

SCHEDULE_EXACT_ALARM, izin yang diperkenalkan di Android 12 bagi aplikasi untuk menjadwalkan alarm yang tepat, tidak lagi diberikan terlebih dahulu ke sebagian besar aplikasi yang baru diinstal dan menargetkan Android 13 dan lebih tinggi (akan disetel ke tolak secara default). Jika pengguna mentransfer data aplikasi ke perangkat yang menjalankan Android 14 melalui operasi pencadangan dan pemulihan, izin akan tetap ditolak. Jika aplikasi yang ada sudah memiliki izin ini, izin tersebut akan diberikan sebelumnya saat perangkat diupgrade ke Android 14.

Izin SCHEDULE_EXACT_ALARM diperlukan untuk memulai alarm yang tepat melalui API berikut atau SecurityException akan ditampilkan:

Praktik terbaik yang ada untuk izin SCHEDULE_EXACT_ALARM tetap diterapkan, termasuk hal berikut:

Aplikasi yang terkena dampak

Jika perangkat menjalankan Android 14 atau yang lebih tinggi, perubahan ini akan memengaruhi aplikasi yang baru diinstal dan memiliki karakteristik berikut:

Aplikasi kalender dan jam alarm harus mendeklarasikan USE_EXACT_ALARM

Aplikasi kalender atau jam alarm perlu mengirim pengingat kalender, alarm bangun tidur, atau notifikasi saat aplikasi tidak lagi berjalan. Aplikasi ini dapat meminta izin normal USE_EXACT_ALARM. Izin USE_EXACT_ALARM akan diberikan saat penginstalan, dan aplikasi yang memiliki izin ini dapat menjadwalkan alarm yang tepat seperti aplikasi dengan izin SCHEDULE_EXACT_ALARM.

Kasus penggunaan yang mungkin tidak memerlukan alarm yang tepat

Karena izin SCHEDULE_EXACT_ALARM kini ditolak secara default dan proses pemberian izin memerlukan langkah tambahan dari pengguna, developer sangat dianjurkan untuk mengevaluasi kasus penggunaan mereka dan menentukan apakah alarm yang tepat masih masuk akal untuk kasus penggunaannya.

Daftar berikut menunjukkan alur kerja umum yang mungkin tidak memerlukan alarm yang tepat:

Menjadwalkan pekerjaan berulang selama masa aktif aplikasi Anda
Metode set() berguna jika tugas perlu memperhatikan batasan real-time, seperti berbunyi pada pukul 14.00 besok atau dalam 30 menit. Jika tidak, sebaiknya gunakan metode postAtTime() atau postDelayed().
Pekerjaan latar belakang terjadwal, seperti mengupdate aplikasi dan mengupload log
WorkManager menyediakan cara untuk menjadwalkan pekerjaan berkala yang terikat waktu. Anda dapat memberikan interval pengulangan dan flexInterval (minimum 15 menit) untuk menentukan runtime terperinci bagi tugas.
Alarm perlu berbunyi pada perkiraan waktu saat sistem dalam status tidak ada aktivitas
Menggunakan alarm yang tidak tepat. Secara khusus, panggil setAndAllowWhileIdle().
Tindakan yang ditentukan pengguna yang akan terjadi setelah waktu tertentu
Menggunakan alarm yang tidak tepat. Secara khusus, panggil set().
Tindakan yang ditentukan pengguna yang dapat terjadi dalam satu periode waktu
Menggunakan alarm yang tidak tepat. Secara khusus, panggil setWindow(). Perhatikan bahwa panjang periode terkecil yang diizinkan adalah 10 menit.

Langkah-langkah migrasi untuk terus menggunakan alarm yang tepat

Setidaknya, aplikasi harus memeriksa apakah aplikasi memiliki izin sebelum menjadwalkan alarm yang tepat. Jika tidak memiliki izin, aplikasi harus memintanya dari pengguna dengan memanggil intent.

Ini sama dengan alur kerja standar untuk meminta izin khusus:

  1. Aplikasi harus memanggil AlarmManager.canScheduleExactAlarms() untuk mengonfirmasi bahwa aplikasi memiliki izin yang sesuai.
  2. Jika aplikasi tidak memiliki izin, panggil intent yang menyertakan ACTION_REQUEST_SCHEDULE_EXACT_ALARM, bersama dengan nama paket aplikasi, untuk meminta pengguna memberikan izin.

    Periksa keputusan pengguna di metode onResume() aplikasi Anda.

  3. Dengarkan siaran AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED yang dikirim jika pengguna memberikan izin.

  4. Jika pengguna memberikan izin ke aplikasi, aplikasi Anda dapat menyetel alarm yang tepat. Jika pengguna menolak izin, turunkan pengalaman aplikasi Anda secara halus agar aplikasi menyediakan fungsi bagi pengguna tanpa informasi yang dilindungi oleh izin tersebut.

Cuplikan kode berikut menunjukkan cara memeriksa izin SCHEDULE_EXACT_ALARM:

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

Kode contoh untuk memeriksa izin dan menangani keputusan pengguna di onResume():

override fun onResume() {
     
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

Melakukan degradasi halus pada penolakan izin

Beberapa pengguna akan menolak untuk memberikan izin. Dalam skenario ini, sebaiknya aplikasi menurunkan kualitas pengalaman secara halus dan tetap berupaya memberikan pengalaman pengguna pengganti terbaik dengan mengidentifikasi kasus penggunaan mereka.

Pengecualian

Jenis aplikasi berikut selalu diizinkan untuk memanggil metode setExact() atau setExactAndAllowWhileIdle():

  • Aplikasi yang ditandatangani dengan sertifikat platform.
  • Aplikasi dengan hak khusus.
  • Aplikasi yang berada dalam daftar yang diizinkan (jika aplikasi Anda memenuhi persyaratan, Anda dapat memintanya menggunakan tindakan intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).

Pemberian terlebih dahulu

Pedoman pengujian

Untuk menguji perubahan ini, nonaktifkan izin Alarms & reminders untuk aplikasi Anda dari halaman Special app access di setelan sistem (Settings > Apps > Special app access > Alarms & reminders) dan amati perilaku aplikasi Anda.