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:
- Periksa izin dengan
canScheduleExactAlarms()
sebelum menjadwalkan alarm yang tepat. - Siapkan aplikasi Anda untuk memproses dan bereaksi dengan benar pada siaran latar depan
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
, yang akan dikirimkan sistem saat pengguna memberikan izin.
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:
- Menargetkan Android 13 (API level 33) atau yang lebih tinggi.
- Mendeklarasikan izin
SCHEDULE_EXACT_ALARM
dalam manifes. - Tidak termasuk dalam skenario pengecualian atau pemberian terlebih dahulu.
- Bukan aplikasi kalender atau jam alarm.
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 metodepostAtTime()
ataupostDelayed()
. - 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:
- Aplikasi harus memanggil
AlarmManager.canScheduleExactAlarms()
untuk mengonfirmasi bahwa aplikasi memiliki izin yang sesuai. 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.Dengarkan siaran
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
yang dikirim jika pengguna memberikan izin.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
- Pemegang peran
SYSTEM_WELLBEING
akan diberiSCHEDULE_EXACT_ALARM
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.