Les wakeups sont un mécanisme de l'API AlarmManager
qui permet aux développeurs de définir une alarme pour réactiver un appareil à un moment précis. Votre application définit une alarme wakeup en appelant l'une des méthodes set()
d'AlarmManager
avec l'indicateur RTC_WAKEUP
ou ELAPSED_REALTIME_WAKEUP
. Lorsqu'une alarme wakeup est déclenchée, l'appareil sort du mode d'économie d'énergie et reste dans un état de wakelock partiel tout en exécutant la méthode onReceive()
ou onAlarm()
de l'alarme. Un déclenchement excessif des alarmes wakeup peut entraîner le déchargement de la batterie.
Pour vous aider à améliorer la qualité des applications, Android surveille automatiquement les applications pour détecter un nombre excessif d'alarmes wakeup et affiche les informations dans Android Vitals. Pour en savoir plus sur la collecte des données, consultez la documentation de la Play Console.
Si votre application réactive l'appareil de manière excessive, vous pouvez suivre les instructions de cette page pour diagnostiquer et résoudre le problème.
Résoudre le problème
La AlarmManager
était
introduites dans les premières versions de la plate-forme Android, mais au fil du temps, de nombreuses personnes
qui nécessitaient auparavant
AlarmManager
sont désormais
mieux adapté aux nouvelles
fonctionnalités comme
WorkManager.
Cette section contient des conseils pour réduire les alarmes wakeup, mais à long terme, envisagez de migrer votre application pour suivre les recommandations de la section Bonnes pratiques.
Identifiez les aspects de votre application où vous programmez des alarmes wakeup et réduisez leur fréquence. Voici quelques conseils :
Recherchez les appels émis vers les différentes méthodes
set()
d'AlarmManager
qui incluent l'indicateurRTC_WAKEUP
ouELAPSED_REALTIME_WAKEUP
.Nous vous recommandons d'inclure le nom du package, de la classe ou de la méthode dans le nom de l'indicateur de l'alarme, afin de pouvoir identifier facilement l'emplacement de la source où l'alarme a été définie. Voici quelques conseils supplémentaires :
- N'indiquez aucune information permettant d'identifier personnellement l'utilisateur dans le nom, comme une adresse e-mail. Sinon, l'appareil enregistre
_UNKNOWN
au lieu du nom de l'alarme. - N'obtenez pas le nom de la classe ou de la méthode par programmation, par exemple en appelant
getName()
, car il pourrait être obscurci par ProGuard. Utilisez plutôt une chaîne codée en dur. - N'ajoutez pas de compteur ni d'identifiants uniques aux identificateurs d'alarme. Le système ne peut pas regrouper les alarmes définies de cette manière, car elles ont toutes des identifiants uniques.
- N'indiquez aucune information permettant d'identifier personnellement l'utilisateur dans le nom, comme une adresse e-mail. Sinon, l'appareil enregistre
Après avoir résolu le problème, vérifiez que vos alarmes wakeup fonctionnent comme prévu en exécutant la commande ADB suivante :
adb shell dumpsys alarm
Cette commande fournit des informations sur l'état du service du système d'alarme sur l'appareil. Pour plus d'informations, consultez la page consacrée à dumpsys.
Bonnes pratiques
N'utilisez les alarmes wakeup que si votre application doit effectuer une opération visible par l'utilisateur (par exemple, publier une notification ou avertir l'utilisateur). Pour obtenir la liste des bonnes pratiques liées à AlarmManager, consultez la page Programmer des alarmes.
N'utilisez pas AlarmManager
pour planifier des tâches en arrière-plan, en particulier les tâches récurrentes ou en arrière-plan du réseau. Utilisez WorkManager pour planifier des tâches en arrière-plan, et ainsi bénéficier des avantages suivants :
- Traitement par lot : les tâches sont regroupées pour réduire l'utilisation de la batterie.
- Persistance : si l'appareil est redémarré, les tâches WorkManager planifiées s'exécutent après le redémarrage.
- Critères : les tâches peuvent s'exécuter sous certaines conditions, par exemple si l'appareil est en charge ou si le Wi-Fi est disponible.
Pour en savoir plus, consultez le Guide relatif au traitement en arrière-plan.
N'utilisez pas AlarmManager
pour planifier des opérations temporelles qui ne sont valides que lorsque l'application est en cours d'exécution. En d'autres termes, cette opération doit être annulée lorsque l'utilisateur quitte l'application. Dans ce cas, utilisez la classe Handler
, car elle est plus facile à utiliser et beaucoup plus efficace.
Recommandations personnalisées
- Remarque : Le texte du lien s'affiche lorsque JavaScript est désactivé
- Wakelocks partiels figés
- ANR