Les alarmes exactes sont destinées aux notifications ou aux actions intentionnelles de l'utilisateur qui doivent se produire à une heure précise.
SCHEDULE_EXACT_ALARM
, l'autorisation introduite dans Android 12 pour les applications afin de programmer des alarmes exactes, n'est plus accordée à la plupart des applications nouvellement installées ciblant Android 13 ou version ultérieure (l'autorisation sera refusée par défaut). Si l'utilisateur transfère des données d'application vers un appareil exécutant Android 14 via une opération de sauvegarde et de restauration, l'autorisation sera toujours refusée. Si un
application existante dispose déjà de cette autorisation, elle sera pré-accordée lorsque l'appareil
les mises à niveau vers Android 14.
L'autorisation SCHEDULE_EXACT_ALARM
est requise pour déclencher des alarmes exactes via les API suivantes, sinon une exception SecurityException
sera générée :
Les bonnes pratiques existantes concernant l'autorisation SCHEDULE_EXACT_ALARM
s'appliquent toujours, y compris les suivantes :
- Vérifiez l'autorisation avec
canScheduleExactAlarms()
avant de programmer des alarmes exactes. - Configurez votre application pour qu'elle écoute et réagisse correctement à la diffusion de premier plan
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
, que le système envoie lorsque l'utilisateur accorde l'autorisation.
Applications concernées
Si un appareil est équipé d'Android 14 ou version ultérieure, cette modification affectera une application nouvellement installée présentant les caractéristiques suivantes :
- Cible Android 13 (niveau d'API 33) ou version ultérieure.
- Déclare l'autorisation
SCHEDULE_EXACT_ALARM
dans le fichier manifeste. - N'entre pas dans le cadre d'une exception ou d'un accord préalable.
- N'est pas une application d'agenda ou de réveil.
Les applications d'agenda et de réveil doivent déclarer USE_EXACT_ALARM.
Les applications d'agenda ou de réveil doivent envoyer des rappels dans l'agenda, des alarmes de réveil ou des alertes lorsque l'application n'est plus en cours d'exécution. Ces applications peuvent demander l'autorisation normale USE_EXACT_ALARM
. L'autorisation USE_EXACT_ALARM
sera accordée lors de l'installation. Les applications disposant de cette autorisation pourront programmer des alarmes exactes, tout comme les applications disposant de l'autorisation SCHEDULE_EXACT_ALARM
.
Cas d'utilisation ne nécessitant pas forcément d'alarme exacte
Étant donné que l'autorisation SCHEDULE_EXACT_ALARM
est désormais refusée par défaut et que le processus d'octroi d'autorisations nécessite des étapes supplémentaires de la part des utilisateurs, les développeurs sont vivement encouragés à évaluer leurs cas d'utilisation et à déterminer si des alarmes exactes sont toujours pertinentes.
La liste suivante répertorie les workflows courants ne nécessitant pas obligatoirement une alarme exacte :
- Planifier des tâches récurrentes pendant la durée de vie de votre application
- La méthode
set()
est utile si la tâche doit tenir compte des contraintes en temps réel, par exemple pour partir à 14h demain ou dans 30 minutes. Sinon, nous vous recommandons d'utiliser plutôt les méthodespostAtTime()
oupostDelayed()
. - Travail d'arrière-plan planifié, comme la mise à jour de votre application et l'importation de journaux
WorkManager
permet de planifier des tâches périodiques sensibles au facteur temps. Vous pouvez fournir un intervalle de répétition et un intervalle flexible (15 minutes minimum) pour définir un environnement d'exécution précis pour le travail.- Alarme requise pour se déclencher à une heure approximative lorsque le système est inactif
- Utilisez une alarme inexacte. Plus précisément, appelez
setAndAllowWhileIdle()
. - Action spécifiée par l'utilisateur devant se produire après une heure précise
- Utilisez une alarme inexacte. Plus précisément, appelez
set()
. - Action spécifiée par l'utilisateur pouvant se produire dans un délai donné
- Utilisez une alarme inexacte. Plus précisément, appelez
setWindow()
. Notez que le délai le plus court autorisé est de 10 minutes.
Procédure de migration pour continuer à utiliser des alarmes exactes
Au minimum, les applications doivent vérifier si elles ont l'autorisation avant de programmer des alarmes exactes. Si les applications ne disposent pas de l'autorisation, elles doivent les demander à l'utilisateur en appelant un intent.
Il s'agit du même processus standard que celui pourdemander une autorisation spéciale :
- Les applications doivent appeler
AlarmManager.canScheduleExactAlarms()
pour vérifier qu'elles disposent des autorisations appropriées. Si l'application ne dispose pas de l'autorisation, appelez un intent qui inclut l'
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
avec le nom du package de l'application pour demander aux utilisateurs d'accorder l'autorisation.Vérifiez la décision de l'utilisateur dans la méthode
onResume()
de votre application.Écoutez les diffusions
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
qui sont envoyées si l'utilisateur accorde l'autorisation.Si l'utilisateur a accordé l'autorisation à votre application, celle-ci peut définir des alarmes exactes. S'il a refusé l'autorisation, effectuez une dégradation élégante de l'expérience de votre application afin qu'elle lui propose une fonctionnalité sans les informations protégées par cette autorisation.
L'extrait de code suivant montre comment vérifier l'autorisation 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))
}
}
Exemple de code pour vérifier l'autorisation et gérer les décisions de l'utilisateur dans 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(...)
}
}
Dégradation élégante en cas de refus d'autorisation
Certains utilisateurs refusent d'accorder l'autorisation. Dans ce scénario, nous recommandons aux applications de procéder à une dégradation élégante de l'expérience, tout en essayant d'offrir la meilleure expérience utilisateur de remplacement possible en identifiant leurs cas d'utilisation.
Exceptions
Les types d'applications suivants sont toujours autorisés à appeler les méthodes setExact()
ou setExactAndAllowWhileIdle()
:
- Applications signées avec le certificat de plate-forme
- Applications privilégiées
- Les applications figurant sur la liste d'autorisation de l'alimentation (si votre application répond aux exigences, vous pouvez en faire la demande à l'aide de l'action d'intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
).
Accords préalables
- L'autorisation
SCHEDULE_EXACT_ALARM
sera attribuée aux détenteurs du rôleSYSTEM_WELLBEING
.
Consignes de test
Pour tester cette modification, désactivez l'autorisation Alarmes et rappels pour votre application sur la page Accès spécifiques des applications dans les paramètres système (Settings > Apps > Special app access > Alarms & reminders) (Paramètres > Applications > Accès spécifiques des applications > Alarmes et rappels) et observez le comportement de votre application.