web-dev-qa-db-fra.com

Android Oreo tuant les services d'arrière-plan et effaçant les alarmes en attente, les travaux planifiés après être entré en mode somnolence

Mon application a un arrière-plan service en cours d'exécution qui met les utilisateurs à jour location et le met à jour sur un serveur toutes les cinq minutes. Pour exécuter ce processus de mise à jour location en continu, j'utilise le gestionnaire d'alarmes pour définir sa prochaine heure d'exécution à partir du service lui-même. Cependant, lorsque j'installe l'application dans mon Nokia 6 Exécutant Android 8.1 Cela fonctionne pendant un certain temps et si je laisse le téléphone inactif pendant un certain temps, mon service sera tué avec le les prochaines alarmes de l'application sont également effacées du système alarm manager. Je suppose que le temps d'inactivité fait entrer le téléphone doze mode. Cependant, je ne comprends pas pourquoi les gestionnaires d'alarmes ont été effacés. À ma connaissance, le doze mode Devrait ouvrir périodiquement des fenêtres de maintenance pour exécuter toutes les tâches en attente.

Pour atténuer ce problème, j'ai essayé d'appliquer un JobSchedulerservice au-dessus de AlarmManager, qui s'exécute toutes les 15 minutes. Le but de ce jobscheduler était de redémarrer le service qui contient le alarmmanager, donc même s'il est tué et que l'alarme est effacée, jobscheduler relancerait le service.

Après avoir testé ce correctif et l'avoir conservé pendant un certain temps pour aller dans idle mode, Il a résulté en l'obtention de JobSchedulerService et Service qui a l'alarme dans il a tué avec les travaux programmés et les alarmes se sont effacées du système.

Il est dit dans la documentation Android Android que nous pouvons utiliser JobScheduler pour atténuer ses limitations d'exécution en arrière-plan. Et pour tester cela, j'ai forcé tué les deux services lorsque J'ai testé l'application, mais le travail déjà planifié n'a pas été effacé et il a réussi à faire fonctionner service avec l'alarme. Je ne comprends pas la raison de ce comportement, bien que les gars d'Evernote donnent une explication qui pourrait correspondre à ce scénario ici Job Android par Evernote

Des idées pour ce comportement anormal?

Détails de l'environnement de test

  • Appareil: Nokia 6 (TA-1021)
  • OS: Android 8.1.0
12
k9yosh

Vous ne pourriez pas exécuter les services d'arrière-plan pendant longtemps dans Oreo car il y a des changements de comportement, maintenant Oreo pour optimiser la mémoire système, la batterie, etc., il tue le service d'arrière-plan, pour résoudre votre problème, vous devez utiliser le service de premier plan.

Jetez un œil aux limites d'exécution en arrière-plan https://developer.Android.com/about/versions/oreo/Android-8.0-changes

Une suggestion de ma part, si vous pouvez utiliser FCM, allez-y, car des applications comme WeChat, Facebook l'utilise, pour envoyer des notifications et elles ne rencontrent aucun problème ...

J'espère que cela vous aidera à comprendre le problème ...

4
Abdul Aziz

Je suis actuellement confronté au même problème et je fais le même travail que vous. C'est-à-dire, définir le Jobscheduler sur un travail périodique pour lancer mon service de premier plan toutes les 15 minutes au cas où il serait tué pour une raison quelconque, comme une tâche tuée. Cela fonctionne comme un charme sur les versions pré Oreo.

Pour Oreo, la seule solution dont je suis conscient en ce moment est de permettre à l'application de démarrer automatiquement dans les paramètres. Sous les applications installées, c'est. Ensuite, cela devrait fonctionner comme avant Oreo. Ce que j'ai entendu mais pas encore testé, c'est de définir l'option setPersisted (true) dans le Job Scheduler. Dis moi si ça aide

0
Al Cabone

Je suppose que le mode DOZE n'est pas autorisé à utiliser le service en arrière-plan, vous devez donc trouver un moyen que le mode DOZE n'affectera pas sur votre application.Pour résoudre votre problème, vous devez utiliser le service de premier plan. ou effectuez un réglage de la batterie. Quoi qu'il en soit, ma meilleure option est de choisir Firebase Cloud Messaging

0
MK Vimalan

Dans Doze more, les alarmes ne sont pas réinitialisées, mais reportées à une date ultérieure. Vous avez deux options principales ici:

  1. Utilisez soit setAndAllowWhileIdle() ou setExactAndAllowWhileIdle() . Cependant, ceux-ci peuvent également se déclencher à la fréquence maximale de 1 fois par 9 minutes . Vous devrez donc diminuer la fréquence à laquelle vous obtenez l'emplacement dans votre application.

  2. Utilisez un service de premier plan pour afficher une notification de premier plan. Tout le monde le fait (des applications comme Uber, Google Maps, etc.). De cette façon, votre service ne sera pas tué et sera traité comme si vous aviez une application ouverte.

0
Abdul Wasae