web-dev-qa-db-fra.com

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 new Android WorkManager. Je crois comprendre qu'une fois programmé, il sera toujours exécuté en arrière-plan, indépendamment du cycle de vie de l'application. Est-ce exact? 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)
19
Tuesday Four AM

Basé sur divers problèmes signalés sur le WorkManager bugtracker , leur documentation n’est pas tout à fait précise sur le comportement exact du WorkManager dans de tels cas Edge.

Sur certains appareils, les applications sont forcées à l'arrêt lorsque l'application est supprimée du gestionnaire de tâches, ce qui est attendu. ... source


Malheureusement, certains appareils implémentent la suppression de l'application à partir du menu récent sous forme d'arrêt forcé. Stock Android ne le fait pas. Lorsqu'une application est arrêtée de force, elle ne peut pas exécuter de tâches, recevoir des alarmes ou des diffusions, etc. Malheureusement, il est impossible pour nous de la résoudre - 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 constructeurs chinois considèrent que glisser du rejet de Récents est un arrêt de force. Lorsque cela se produit, WorkManager replanifie tous les travaux en attente au prochain démarrage de l'application. Étant donné qu'il s'agit d'une violation de CDD, WorkManager ne peut rien faire de plus compte tenu de sa bibliothèque cliente. source


Pour ajouter à cela, si un fabricant d’appareils a décidé de modifier le stock Android pour forcer l’arrêt de l’application, WorkManager cessera de fonctionner (de même que JobScheduler, les alarmes, les récepteurs de diffusion, etc.). Il n’est malheureusement pas possible de contourner ce problème. Malheureusement, dans certains cas, WorkManager ne fonctionnera plus jusqu'au prochain lancement de l’application. source


Avec le test intense de OneTimeWorkRequest (sans contraintes) sur un Pixel 2 XL avec un stock Android), le comportement est le suivant:

  • Gestionnaire de tâches proche:
    • Le travail continue (après un peu)
  • Redémarrez le périphérique (travail en cours):
    • Le travail continue après le redémarrage
  • Informations sur l'application "Forcer l'arrêt":
    • Le travail s'arrête et ne continue que lorsque l'application est relancée
  • Redémarrez le périphérique (le travail était "Force Stopped"):
    • Le travail ne continue pas tant que l'application n'est pas redémarrée

Vous pouvez trouver une liste complète des différents comportements OEM sur dontkillmyapp.com . Il semble que l’équipe Android reconnaît également ce problème et a ajouté un test à cet effet dans son test CTS pour Android Q. source

46
mikepenz

D'après ce que j'ai compris, une fois programmé, il sera toujours exécuté en arrière-plan, indépendamment du cycle de vie de l'application. Est-ce correct?

Oui. Basé sur le documentation

L'exécution de la tâche est toujours garantie, même si votre application est forcée de quitter ou le périphérique redémarré.

WorkManager choisit la méthode appropriée pour exécuter votre tâche en fonction de facteurs tels que le niveau de l'API du périphérique et l'état de l'application. Si WorkManager exécute l'une de vos tâches pendant l'exécution de l'application, WorkManager peut exécuter votre tâche dans un nouveau thread dans le processus de votre application. Si votre application n'est pas en cours d'exécution, WorkManager choisit un moyen approprié pour planifier une tâche en arrière-plan, en fonction du niveau de l'API du périphérique.

WorkManager peut utiliser JobScheduler, JobDispatcher de Firebase ou AlarmManager en fonction du niveau de l'API. Il respectera les règles et examinera toutes les autres contraintes avant d'exécuter les travaux. Vous pouvez vous attendre à un certain retard en mode Doze car il pourrait attendre la fenêtre de maintenance.

Remarque:

WorkManager est destiné aux tâches nécessitant la garantie que le système les exécutera même si l'application se ferme, comme le téléchargement de données d'application sur un serveur. Il n'est pas conçu pour les travaux en arrière-plan en cours de processus pouvant être terminés en toute sécurité si le processus d'application disparaît; pour de telles situations, nous vous recommandons d'utiliser ThreadPools.

6
Sagar

Voici ce que dit la documentation:

Remarque: WorkManager est destiné aux tâches nécessitant la garantie que le système les exécutera même en cas de fermeture de l'application, comme le téléchargement de données d'application sur un serveur. Il n'est pas conçu pour les travaux en arrière-plan en cours de processus pouvant être terminés en toute sécurité si le processus d'application disparaît; pour de telles situations, nous vous recommandons d'utiliser ThreadPools.

Mais il doit y avoir une condition. si cette condition est remplie, WorkManager exécutera la tâche (cela est important). Conditions comme "uniquement lorsque l'appareil est en charge et en ligne"

Lisez ceci avec soin , Le gestionnaire de travaux tente d'exécuter votre tâche à l'intervalle que vous demandez, , sous réserve des contraintes que vous imposez et ses autres exigences.

Ici, j'ai trouvé un bon tutoriel sur l'utilisation de WorkManager pour la planification de tâches: https://Android.jlelse.eu/how-scheduling-work-with-new-Android-jetpack-component-workmanager-852163f4825b =

2
VicJordan