AlarmManager ne fonctionne pas sur plusieurs appareils
mon application utilise AlarmManager et fonctionne depuis 4 ans. Mais j'ai remarqué qu'il a commencé à défaut dans certains appareils.
je suis assez sûr que le code est bon (j'utilise WakefulBroadcastReceiver, et setExactAndAllowWhileIdle pour les appareils avec Doze) parce qu'il fonctionne parfaitement sur les appareils Nexus, mais il échoue dans les appareils de certains fabricants (Huawei, Xiaomi...).
appareils Huawei, par exemple, ont une sorte de gestionnaire de batterie qui tue applications, et quand une application est tuée, les alarmes programmées sont annulées. Ainsi, configurer une application comme "protégée" dans Huawei battery manager résout le problème.
mais récemment j'ai remarqué qu'il ne fonctionne pas avec d'autres appareils: Xiaomi, Samsung (peut-être est-il lié au nouveau "Smart Manager"?)... Il semble que ce comportement est en train de devenir une norme: tuer les applications d'arrière-plan.
Quelqu'un sait quelque chose? Un moyen de s'assurer que l'alarme est déclenchée?
14 réponses
j'essaie de le résoudre depuis plusieurs semaines. Je n'ai rien trouvé. Huawei juste tuer toutes les alarmes après un certain temps. Si je mets l'application à l'application protégée dans leur épargnant de batterie il n'aide pas. mais si je change le nom du paquet de mon application pour contenir des mots comme alarme, horloge ou Calendrier, il fonctionne tout à fait normal comme sur tous les autres appareils. Je ne comprends pas comment Google peut donner la certification pour cette merde. Je pense que L'OEM ne devrait pas modifier la plate-forme de base dans une telle façon. Je comprends qu'ils ont de la pâte gain de tuer l'application après un certain temps, lorsque l'utilisateur ne l'utilisez pas. Mais ce killing alarme aussi des applications protégées.
aussi setAlarmClock() pour des alarmes de timing précis aide. Mais il n'est pas possible de l'utiliser pour pense comme widget de mise à jour.
le problème est Smart Manager. Samsung dispose d'un gestionnaire de batterie qui empêche parfois certaines applications de fonctionner en arrière-plan. Elle a essayé de "reprendre" lorsque vous revenez à l'application, mais désactive complètement l'application ou peut reprendre toutes les 5 minutes environ (selon la façon dont Samsung a).
cela fonctionnerait sur les versions stock d'android comme il n'y a pas de Samsung Manager. Vous pouvez également installer la version personnalisée d'android qui dispose de certaines fonctionnalités pour activer SM (en fonction de la ROM.)
utiliser AlarmManager pour < 5.0 dispositifs, et Jobcheduler Pour 5.0+ dispositifs. Je ne peux pas dire avec certitude que JobScheduler ne sera pas affecté par le fabricant shenanigans, mais il semblerait beaucoup moins probable pour moi, étant donné que L'Android essaie de déplacer les gens loin de AlarmManager et sur JobScheduler.
EDIT: Google est sorti avec une solution de première partie à ce problème appelé WorkManager . Il résume les cadres de planification multiples et utilise le plus approprié pour le périphérique.
j'ai arrêté d'utiliser AlarmManager il y a un moment... une alternative meilleure et plus stable
- créer un service
- enregistrer un émetteur pour BOOT_COMPLETED
- le feu à votre service à partir du récepteur
- lancer un nouveau gestionnaire à l'intérieur de votre service qui se boucle toutes les X minutes ( Android - exécution d'une méthode périodiquement en utilisant postDelayed () appel )
- 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? )
- si oui.. exécuter la tâche et arrêter le manipulateur
Oui.. c'est une douleur..mais le travail est fait quoi qu'il arrive
est-ce que vous écoutez BOOT_COMPLETED? Vous devez remettre les alarmes lorsqu'un appareil est redémarré.
j'ai aussi une application qui définit les alarmes.La solution est d'utiliser AlarmManager.setAlarmClock() sur api >= 21. Ceci n'est pas affecté par doze afaik et a le bonus ajouté de mettre une icône de réveil dans le plateau de système.
la plupart des appareils Android modernes viennent avec une application ou un mécanisme, qui essaie automagiquement de comprendre comment sauver la batterie et en conséquence pourrait tuer certaines applications tierces. Cela peut entraîner la suppression de tâches et d'emplois prévus (p. ex., les alarmes ne se déclenchent pas, la notification par pression ne fonctionne pas, etc.).). Dans de nombreux cas, cela se produit complètement indépendant des mécanismes d'économie de la batterie D'Android, dans mon cas, je ne pouvais pas faire plus d'optimisation de la batterie lorsque je détecte certains modèles de dispositifs, Je rediriger l'utilisateur vers le gestionnaire de démarrage pour blanchir mon application
vous avez trouvé dans ce lien pour chaque modèle l'intention que vous devriez invoquer https://android-arsenal.com/details/1/6771
la plupart des nouveaux téléphones de nos jours sont fournis avec une sorte de batterie/gestionnaire d'économie d'énergie qui font la même chose que vous avez décrit. sans compter les douboosters et les clean masters.
je pense que vous devez mettre un avis de non-responsabilité ou faq dans votre liste app / play store indiquant que cette application doit être mis en exception de votre application battery manager afin de fonctionner correctement.
quelle version D'Android ces appareils fonctionnent-ils?
à partir de L'API 23, le système D'exploitation lui-même passera en mode inactif de faible puissance alors qu'il n'a pas été utilisé pendant un certain temps, et dans ce mode, les alarmes ne seront pas fournies. Il y a une façon pour les applications de dire explicitement "j'ai besoin de cette alarme pour se déclencher à ce moment-ci, indépendamment de l'utilisation de la batterie," cependant; les nouvelles méthodes AlarmManager appelé setAndAllowWhileIdle()
et setExactAndAllowWhileIdle()
.
D'après votre description ça ressemble à ceci ce n'est peut-être pas la cause particulière de vos problèmes sur certains appareils OEM, mais c'est quelque chose que tous les développeurs utilisant le Gestionnaire D'alarmes devraient savoir.
enfin, de nombreuses utilisations du Gestionnaire D'alarmes sont mieux traitées en utilisant les mécanismes du Planificateur de tâches. Pour rétrocompatibilité les services de jeu "GCM Network Manager" est en fait très proche de L'ordonnanceur de travail dans la fonctionnalité -- il utilise L'ordonnanceur de travail en interne sur les nouvelles versions D'Android -- et il ne s'agit pas nécessairement de réseautage, malgré le nom de la classe.
Je ne pense pas que tuer l'application empêchera le directeur d'alarme 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 d'appels de alarm manager.
la cause profonde pourrait être autre chose.
Également sur M... setexactandallow whileidle does throttling...c'est si u programmer une alarme toutes les 2 minutes, il ne sera pas déclenché. ..Il doit y avoir une fenêtre de 15 minutes. .
Pour Xiaomi vous pouvez avoir besoin d'activer AutoStart pour votre application. J'essaie de faire à une liste de modifications Android (généralement du fabricant de téléphone) qui peuvent affecter un processus de fond. Si vous avez quelque chose de nouveau s'il Vous Plaît ajouter une réponse ici liste des tueurs de tâche Android
nous avons besoin d'activer notre application dans autostart manager dans app manager, certains appareils comme vivo v5,
In vivo v5, Nous pouvons trouver ce menu dans iManager-->Gestionnaire d'Application--> Gestionnaire de Démarrage Automatique. Activez notre application ici.
alors votre alarme / alarmmanager déclenchera l'alarme si l'application est désactivée ou fermée.
je cherchais une réponse et après plusieurs heures j'ai trouvé ceci:
https://stackoverflow.com/a/35220476/3174791
dans le résumé est une façon de savoir si votre application a été tué par "applications protégées" et cela ne fonctionne que sur les appareils Huawei. faites-moi savoir s'il y a une solution pour d'autres appareils (Samsung,Sony,Xiaomi, etc).
Leave Alarm Manager Use Google Cloud""
si votre application fonctionne en ligne(avec Internet), vous pouvez créer un côté service @ server qui peut envoyer Google Cloud périodiquement. Il peut aider à contourner ces paramètres spécifiques à l'Appareil pour exécuter AlarmManager.
Merci