58 votes

Android. WorkManager est-il en cours d'exécution lorsque l'application est fermée?

Je souhaite planifier des mises à jour nocturnes de la base de données. J'utilise donc le nouveau Android WorkManager. Ma compréhension est qu'une fois programmé, il s'exécutera toujours en arrière-plan indépendamment du cycle de vie de l'application. Est-ce correct? Mes premiers tests montrent que le travail n'est effectué que lorsque l'application est en cours d'exécution.

 val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
                        .addTag("DATABASE_UPDATE_SERVICE")
                        .build()
WorkManager.getInstance().enqueue(locationWork)
 

103voto

mikepenz Points 1258

Basé sur les différents problèmes signalés sur le WorkManager le bugtracker, leur documentation n'est pas complètement précis sur le comportement exact de la WorkManager dans de tels cas de bord.

Sur certains appareils, les applications sont la force arrêté lorsque l'application est désactivée dans le gestionnaire des tâches, afin que la partie est prévu. ... source


Malheureusement, certains appareils de mettre en œuvre de tuer l'application à partir de l'récents menu comme une force d'arrêt. Stock Android ne fait pas cela. Lorsqu'une application est en vigueur arrêté, il ne peut pas exécuter les travaux, de recevoir des alarmes ou des émissions, etc. Donc, malheureusement, il est impossible pour nous d'y remédier le problème réside dans le système d'exploitation et il n'y a pas de solution de contournement. source


Le seul problème que nous avons rencontré est le cas où certains en chine Oem traiter mouvement du doigt de Récents comme une force d'arrêt. Lorsque cela se produit, WorkManager planifier toutes les tâches en attente, la prochaine fois que l'application démarre. Étant donné que c'est un CDD de violation, il n'y a pas beaucoup plus que WorkManager pouvez le faire compte tenu de son client de la bibliothèque. source


Pour ajouter à cela, si le fabricant d'un appareil a décidé de modifier stock Android à la force d'arrêter l'application, WorkManager va arrêter de travailler (comme JobScheduler, les alarmes, les récepteurs de radiodiffusion, etc.). Il n'y a aucun moyen de contourner cela. Certains fabricants de périphériques ce faire, malheureusement, donc dans ce cas WorkManager cessera de fonctionner jusqu'à ce que la prochaine fois que l'application est lancée. source


Avec des tests intenses d'un OneTimeWorkRequest (sans contraintes) sur un Pixel 2 XL avec le stock android, le comportement est le suivant:

  • Le gestionnaire des tâches de proximité:
    • Le travail continue (après un peu)
  • Redémarrer l'appareil (travail en cours):
    • Le travail se poursuit après le redémarrage fait
  • Informations sur l'application "Forcer l'arrêt":
    • Arrêts de travail, ne reprendra que lorsque l'application est lancée à nouveau
  • Redémarrer l'appareil (travail a été "Forcer l'arrêt"):
    • Le travail ne continue pas jusqu'à ce que l'application est relancée

Vous pouvez trouver une liste complète des différents OEM comportements sur dontkillmyapp.com. Il semble que l'Android équipe remercie également de cette question et a ajouté un test pour cela dans leurs CTS de test pour Android Q. source

5voto

Sagar Points 12352

Ma compréhension est que, une fois programmé, il sera toujours courir dans le plan de manière indépendante de l'application du cycle de vie. Est ce que le droit?

Oui. Basé sur la documentation

La tâche est encore garanti, même si votre application est forcée de quitter ou l'appareil est redémarré.

WorkManager choisit le moyen le plus approprié pour exécuter votre tâche basée sur des facteurs tels que l'appareil de niveau API et de l'application de l'état. Si WorkManager exécute l'une de vos tâches, tandis que l'application est en cours d'exécution, WorkManager pouvez exécuter votre tâche dans un nouveau thread dans votre application du processus. Si votre application n'est pas en cours d'exécution, WorkManager choisit une façon de planifier une tâche en arrière-plan, selon le dispositif de l'API de niveau.

WorkManager peut utiliser JobScheduler, Firebase JobDispatcher, ou AlarmManager selon le niveau de l'API. Il repecte le Doze et conaider toutes les autres contraintes, avant l'exécution des Travaux. Vous pouvez vous attendre un certain retard dans le Doze mode depuis qu'il pouvait attendre de la fenêtre de maintenance.

Note:

WorkManager est prévu pour les tâches qui nécessitent une garantie que le système fonctionne, même si l'application quitte, comme le téléchargement de données de l'application sur un serveur. Il n'est pas prévu dans le processus de travail de fond qui peut être résilié si l'application du processus va plus loin, pour de telles situations, nous vous recommandons d'utiliser ThreadPools.

1voto

VicJordan Points 382

C'est ce que la documentation est à dire:

Remarque: WorkManager est prévu pour les tâches qui nécessitent une garantie que le système fonctionne, même si l'application quitte, comme le téléchargement de données de l'application sur un serveur. Il n'est pas prévu dans le processus de travail de fond qui peut être résilié si l'application du processus va plus loin, pour de telles situations, nous vous recommandons d'utiliser ThreadPools.

Mais il doit y avoir une certaine condition. si cette condition répondre, puis WorkManager sera exécuter la tâche (c'est important). Conditions comme "uniquement lorsque le téléphone est en charge et en ligne"

Lisez ceci attentivement, Le WorkManager tentatives d'exécution de votre tâche à l'intervalle de demande, sous réserve des contraintes imposées et ses autres besoins.

Ici, j'ai trouvé un bon tutoriel sur la façon d'utiliser WorkManager pour l'ordonnancement des tâches : https://android.jlelse.eu/how-scheduling-work-with-new-android-jetpack-component-workmanager-852163f4825b

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X