web-dev-qa-db-fra.com

Gestionnaire d'alarmes Android setExactAndAllowWhileIdle () ne fonctionne pas dans Android 7.0 Nougat en mode Doze

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:

  1. Je règle l'alarme lorsque j'ouvre mon application. 
  2. Je reçois le signal d'alarme à l'aide d'un récepteur WakefulBroadcast. Dans sa méthode 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.
  3. J'appelle completeWakefulIntent à la fin de onReceive ().
  4. J'ai essayé de tester les deux: RTC_WAKEUP et ELAPSED_REALTIME_WAKEUP

Remarques:

  • La classe wakefulbroadcastReceiver est inscrite dans le manifeste.
  • J'ai ajouté des autorisations pour: Android.permission.WAKE_LOCK
  • J'ai essayé White-List mon application, mais les résultats sont les mêmes
  • J'ai essayé d'utiliser 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.
  • Non seulement setExactAndAllowWhileIdle () ne fonctionne pas pendant l'assoupissement, mais il a également une très grande précision lorsqu'il fonctionne. Je reçois généralement beaucoup de signaux d'alarme
    soit 1-3 minutes plus tard ou 1-3 minutes plus tôt.
  • Je teste avec Huawei Mate 8 et Android 7.0 Nougat.

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:

  • Si vous devez définir des alarmes qui se déclenchent à Doze, utilisez SetAndAllowWhileIdle () ou setExactAndAllowWhileIdle ().
  • Les alarmes définies avec setAlarmClock () continuent de se déclencher normalement. Le système Quitte Doze peu de temps avant le déclenchement de ces alarmes.

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%?

13
Mena

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.

2
serv-inc

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 :)

0
jojo625

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.

0
Twisted Lullaby