web-dev-qa-db-fra.com

AlarmManager ne fonctionne pas sur plusieurs appareils

Mon application utilise AlarmManager et fonctionne depuis 4 ans. Mais j'ai remarqué qu'il a commencé à échouer sur certains appareils.

Je suis presque sûr que le code est correct (j'utilise WakefulBroadcastReceiver et setExactAndAllowWhileIdle pour les appareils avec Doze) car il fonctionne parfaitement sur les appareils Nexus, mais il échoue dans les appareils de certains fabricants (Huawei, Xiaomi ...).

Les appareils Huawei, par exemple, ont une sorte de gestionnaire de batterie qui tue les applications et lorsqu'une application est tuée, les alarmes programmées sont annulées. La définition d'une application comme "protégée" dans le gestionnaire de batterie Huawei résout le problème.

Mais récemment, j'ai remarqué que cela ne fonctionne pas avec plus d'appareils: Xiaomi, Samsung (peut-être que c'est lié au nouveau "Smart Manager"?) ... Il semble que ce comportement soit en train de devenir un standard: tuer les applications en arrière-plan.

Quelqu'un connait-il quelque chose à propos de ça? Y a-t-il un moyen de s'assurer que l'alarme est déclenchée?

EDIT: ce problème est dû aux "économiseurs de batterie" ajoutés par différents fabricants. Plus d'informations ici: https://dontkillmyapp.com/

81
Sergio Viudes

J'essaye déjà de le résoudre depuis plusieurs semaines. Je n'ai rien trouvé. Huawei vient de tuer toutes les alarmes après un certain temps. Si je mets l'application sur l'application protégée dans leur économiseur de batterie, cela n'aidera pas. Mais si je change le nom du package de mon application pour qu'il contienne des mots comme réveil, horloge ou calendrier, cela fonctionne tout à fait normalement comme sur n'importe quel autre appareil. Je ne comprends pas comment Google peut donner la certification pour cette merde. Je pense que les OEM ne devraient pas modifier la plateforme principale de cette manière. Je comprends qu'ils ont leur propre économiseur de batterie qui tue l'application après un certain temps, lorsque l'utilisateur ne l'utilise pas. Mais cela tue également les applications protégées.

SetAlarmClock () pour des alarmes de synchronisation exactes aide également. Mais il n'est pas possible de l'utiliser pour des réflexions comme la mise à jour des widgets.

13
ATom

Le problème est Smart Manager. Samsung a un gestionnaire de batterie qui empêche parfois certaines applications de fonctionner en arrière-plan. Il a essayé de "reprendre" lors du retour à l'application, mais désactive complètement l'application ou peut reprendre toutes les 5 minutes environ (selon la façon dont Samsung l'a).

Cela fonctionnerait sur les versions de stock de Android car il n'y a pas de gestionnaire Samsung. Vous pouvez également installer une version personnalisée de Android qui a certaines fonctionnalités pour activer SM (selon sur la rom).

8
S A

Utilisez AlarmManager pour les appareils <5.0 et JobScheduler pour les appareils 5.0+. Je ne peux pas dire avec certitude que JobScheduler ne sera pas affecté par les manigances du fabricant, mais cela me semblerait beaucoup moins probable, étant donné que Android essaie de déplacer les gens loin d'AlarmManager et vers JobScheduler.

EDIT: Google a sorti une solution première à ce problème appelée WorkManager . Il résume plusieurs cadres de planification et utilise le plus approprié pour le périphérique.

2
Tom

La plupart des appareils modernes Android Android sont livrés avec une application ou un mécanisme, qui essaie automatiquement de comprendre comment économiser la batterie et, par conséquent, peut tuer certaines applications tierces. Cela pourrait entraîner la suppression des tâches planifiées et (par exemple, les alarmes ne se déclenchent pas, la notification push ne fonctionne pas, etc.). Dans de nombreux cas, cela se produit complètement indépendamment des mécanismes d'économie de batterie d'Android, dans mon cas, je ne pouvais pas faire plus d'optimisation de la batterie lorsque je détectais le modèle de certains appareils, je redirige l'utilisateur vers le gestionnaire de démarrage pour mettre ma application en liste blanche

Vous avez trouvé dans ce lien pour chaque modèle l'intention que vous devez invoquer https://Android-arsenal.com/details/1/6771

2
baderkhane

J'ai également une application qui définit des alarmes.La solution consiste à utiliser AlarmManager.setAlarmClock () sur api> = 21. Ceci n'est pas affecté par somnoler afaik et a l'avantage supplémentaire de mettre une icône de réveil dans la barre d'état système.

1
Tyler Pfaff

Écoutez-vous BOOT_COMPLETED? Vous devez définir à nouveau les alarmes lorsqu'un appareil est redémarré.

1
Tyler Pfaff

j'ai arrêté d'utiliser AlarmManager il y a quelque temps ... une alternative meilleure et plus stable

  1. créer un service
  2. enregistrer un BroadcastReceiver pour BOOT_COMPLETED
  3. tirez votre service du récepteur
  4. démarrer un nouveau gestionnaire dans votre service qui se boucle toutes les X minutes ( Android - exécution périodique d'une méthode à l'aide de l'appel postDelayed () )
  5. vérifier si le temps d'exécuter la tâche est venu: maintenant - temps d'exécution> 0 ( Comment trouver la durée de la différence entre deux dates en java? )
  6. si c'est le cas .. exécutez la tâche et arrêtez le gestionnaire

oui .. c'est une douleur..mais le travail est fait

0
ymz

Quelle version de Android ces appareils fonctionnent-ils?

À partir de l'API 23, le système d'exploitation lui-même passera en mode veille à faible consommation lorsqu'il n'est pas utilisé depuis un certain temps, et dans ce mode, les alarmes ne seront pas délivrées. Cependant, il existe un moyen pour les applications de dire explicitement: "J'ai besoin que cette alarme se déclenche à ce moment, indépendamment de l'utilisation de la batterie"; les nouvelles méthodes AlarmManager appelées setAndAllowWhileIdle() et setExactAndAllowWhileIdle().

D'après votre description, il semble que cela ne soit pas la cause particulière de vos problèmes sur certains appareils OEM, mais c'est quelque chose que tous les développeurs utilisant Alarm Manager devraient être conscients.

Enfin, de nombreuses utilisations du gestionnaire d'alarmes sont mieux traitées à l'aide des mécanismes du Job Scheduler. Pour des raisons de compatibilité ascendante, le Play Services "GCM Network Manager" est en fait très proche du Job Scheduler en termes de fonctionnalité - il utilise le Job Scheduler en interne sur les versions plus récentes de Android - et ne concerne pas nécessairement réseautage, malgré le nom de la classe.

0
ctate

Nous devons activer notre application dans le gestionnaire de démarrage automatique dans le gestionnaire d'applications, certains combinés comme vivo v5,

In vivo v5, nous pouvons trouver ce menu dans iManager -> App Manager -> Auto Start Manager. Activez notre application ici.

Ensuite, votre alarme/alarmmanager déclenchera l'alarme si l'application est tuée ou fermée.

0
Aneesh NN

Je cherchais une réponse et après plusieurs heures, j'ai trouvé ceci:

https://stackoverflow.com/a/35220476/3174791

En résumé, vous pouvez savoir si votre application a été tuée par des `` applications protégées '' et cela ne fonctionne que sur les appareils Huawei. faites-moi savoir s'il existe une solution pour d'autres appareils (Samsung, Sony, Xiaomi, etc.).

0
Edgar

la plupart des nouveaux téléphones sont aujourd'hui fournis avec une sorte de gestionnaire d'économie d'énergie/batterie qui fait la même chose que vous avez décrite. sans compter les doubleurs et les maîtres propres.

Je pense que vous devez mettre un avis de non-responsabilité ou une FAQ dans votre application/liste Play Store indiquant que cette application doit être mise en exception de votre application de gestion de batterie afin de fonctionner correctement.

0
eriuzo

Pour Xiaomi, vous devrez peut-être activer AutoStart pour votre application. J'essaie de faire une liste de Android modifications (généralement du fabricant du téléphone) qui peuvent affecter un processus d'arrière-plan. Si vous avez quelque chose de nouveau, veuillez ajouter une réponse ici Liste des tueurs de tâches Android

0
Andrei Ciuca

Je ne pense pas que la suppression de l'application empêchera le gestionnaire d'alarmes de réveiller votre application.

Ce n'est que lorsque vous "forcez l'arrêt" ou désactivez l'application que vous ne recevez pas de rappels du gestionnaire d'alarmes.

La cause profonde pourrait être autre chose.

Également sur M ... setExactAndAllowWhileIdle fait la limitation ... c'est-à-dire que si vous programmez une alarme toutes les 2 minutes, elle ne sera pas déclenchée. ..Il doit y avoir une fenêtre de 15 minutes. .

0
rupesh jain