J'essaie de déclencher une alarme dans mon application toutes les 30 minutes à l'aide de la variable setExactAndAllowWhileIdle
de Alarm Manager, mais cela ne fonctionne pas!
Je teste la fonctionnalité en émettant une notification Push chaque fois que je reçois un signal d'alarme.
Le problème est le suivant: lorsque l'appareil passe en mode veille après avoir été inactif pendant un certain temps, je ne reçois plus d'alarmes. Cependant, dès que j'allume l'écran, je reçois une notification. Mon application nécessite des alarmes précises qui doivent être diffusées exactement à l'heure toutes les 30 minutes! Il ne peut pas se permettre de recevoir des alarmes retardées ou abandonnées parce que l'appareil est en mode Doze!
J'ai utilisé ce qui suit dans mon code:
onReceive()
, je règle l'alarme suivante. Je lance aussi un startWakefulService qui n’émet qu’une notification Push, puis s’arrête lui-même.Remarques:
Android.permission.WAKE_LOCK
setAlarmClock()
qui fonctionnait tout le temps, même pendant le mode assoupi , Avec une alarme déclenchée/retardée toutes les 50 alarmes. Donc, ce n’est pas non plus parfait. Et je ne veux pas que l'utilisateur voie une icône d'alarme tout le temps.P.S: Avant de répondre, veuillez vous assurer de connaître les restrictions imposées à partir d'Android 6.0 M et du mode Doze.
Link1: https://developer.Android.com/training/monitoring-device-state/doze-standby.html
En résumé, il dit ceci:
Maintenant, pourquoi ne reçois-je pas des signaux d'alarme précis toutes les 30 minutes avec setExactAndAllowWhileIdle()
?! Et pourquoi setAlarmClock()
n'est-il pas fiable à 100%?
Vous pourriez obtenir des alarmes précises, mais en mode Doze
Le système ignore les verrous de réveil.
Il semble donc que AlarmManager.setAlarmClock
soit la seule solution acceptable si vous vraiment devez déclencher toutes les 30 minutes. Cela annulera probablement toutes les économies d'énergie en mode assoupissement ...
BTW: il semble que vous pouvez voir les alarmes avec adb Shell dumpsys alarm
.
Possibilité: utiliser Firebase JobDispatcher
Firebase JobDispatcher est une bibliothèque permettant de planifier des tâches en arrière-plan dans votre application Android. Il fournit une API compatible JobScheduler qui fonctionne sur toutes les versions récentes d'Android (API de niveau 14 ou supérieur) sur lesquelles les services Google Play sont installés.
J'ai le même problème que vous et cherche longtemps une solution. Mais je ne trouve pas de solution générale.
Une solution pour les appareils Samsung est disponible: Android AlarmManager ne fonctionne pas sur certains appareils lorsque l'application est fermée
La première réponse ne fonctionne pas, mais la seconde :)
Avez-vous essayé d'ajouter votre application à la liste blanche d'optimisation de batterie? Comme certaines informations l'ont souligné ( link ), Huawei dispose d'une gestion de batterie spéciale.