Tâches persistantes Fait partie d'Android Jetpack.

Une tâche est persistante lorsqu'elle reste planifiée lors du redémarrage de l'application ou du système. WorkManager est la solution recommandée pour les tâches persistantes. Étant donné que la plupart des traitements en arrière-plan sont mieux réalisés via des tâches persistantes, WorkManager est également la principale API recommandée pour le traitement en arrière-plan en général.

Types de tâches persistantes

WorkManager gère trois types de tâches persistantes :

  • Exécution immédiate : les tâches doivent commencer immédiatement et se terminer bientôt. Elles peuvent être rendues prioritaires.
  • Exécution longue: tâches pouvant durer plus longtemps, voire plus de 10 minutes.
  • Exécution différable : tâches planifiées qui commencent à une date ultérieure et peuvent s'exécuter régulièrement.

La figure 1 décrit la relation entre les différents types de tâches persistantes.

Une tâche persistante peut être de type exécution immédiate, longue ou différable
Figure 1 : Types de tâches persistantes.

De même, le tableau suivant présente les différents types de tâches.

Type Périodicité Pour y accéder
Immédiateté Ponctuel OneTimeWorkRequest, Worker. Pour une tâche prioritaire, appelez setExpedited() sur votre OneTimeWorkRequest.
Exécution longue Ponctuelle ou régulière Tous les WorkRequest ou Worker. Appelez setForeground() dans Worker pour gérer la notification.
Exécution différable Ponctuelle ou régulière PeriodicWorkRequest, Worker.

Pour en savoir plus sur la configuration de WorkManager, consultez le guide Définir vos WorkRequest.

Fonctionnalités de WorkManager

En plus de fournir une API plus simple et plus cohérente, WorkManager présente un certain nombre d'autres avantages clés :

Contraintes liées aux tâches

Définissez de manière déclarative les conditions optimales pour vos tâches à l'aide de contraintes liées aux tâches. Par exemple, ne les exécutez que lorsque l'appareil est connecté à un réseau dont l'usage n'est pas facturé, lorsqu'il est inactif ou qu'il dispose d'une batterie suffisante.

Planification efficace

WorkManager vous permet de planifier des tâches afin de les exécuter de façon ponctuelle ou répétée pendant des périodes de planification flexibles. Les tâches peuvent également être étiquetées et nommées, ce qui vous permet de planifier des tâches uniques et remplaçables, et de surveiller ou d'annuler des groupes de tâches ensemble.

Les tâches planifiées sont stockées dans une base de données SQLite gérée en interne. WorkManager s'assure que ces tâches persistent et sont reprogrammées lors des redémarrages de l'appareil.

De plus, WorkManager respecte les fonctionnalités d'économie d'énergie et les bonnes pratiques telles que le mode Sommeil. Vous n'avez donc pas à vous en soucier.

Tâche prioritaire

Vous pouvez utiliser WorkManager pour planifier une exécution immédiate en arrière-plan. Utilisez les tâches prioritaires pour les tâches importantes pour l'utilisateur et qui se terminent en quelques minutes.

Règle de nouvelle tentative flexible

Il arrive que la tâche échoue. WorkManager propose des règles de nouvelles tentatives flexibles, y compris une règle d'intervalle exponentiel entre les tentatives configurable.

Association de tâches

Pour les tâches complexes, associez des tâches individuelles à l'aide d'une interface intuitive qui vous permet de contrôler les éléments qui s'exécutent de manière séquentielle et en parallèle.

Kotlin


val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

Java


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

Pour chaque tâche, vous pouvez définir les données d'entrée et de sortie correspondantes. Lorsque les tâches sont associées, WorkManager transmet automatiquement les données de sortie d'une tâche à la suivante.

Interopérabilité intégrée des exécutions de threads

WorkManager s'intègre parfaitement aux coroutines et à RxJava, et sa flexibilité permet de brancher vos propres API asynchrones.

Travaillez de façon fiable avec WorkManager

WorkManager est destiné aux tâches nécessaires à une exécution fiable ; même si l'utilisateur quitte un écran, que l'application se ferme ou que l'appareil redémarre. Par exemple :

  • Envoyer des journaux ou des analyses aux services de backend.
  • Synchroniser régulièrement des données d'application avec un serveur.

WorkManager n'est pas conçu pour une exécution en arrière-plan qui peut être interrompue en toute sécurité si le processus de l'application s'arrête. Il ne s'agit pas non plus d'une solution générale pour toutes les tâches qui nécessitent une exécution immédiate. Consultez le guide de traitement en arrière-plan pour déterminer la solution qui répond à vos besoins.

Relation avec les autres API

Bien que les coroutines soient la solution recommandée pour certains cas d'utilisation, vous ne devez pas les utiliser pour des tâches persistantes. Il est important de noter que les coroutines sont un framework de simultanéité, tandis que WorkManager est une bibliothèque pour les tâches persistantes. De même, n'utilisez AlarmManager que pour les horloges ou les agendas.

API Recommandé pour Relation avec WorkManager
Coroutines Toutes les tâches asynchrones qui n'ont pas besoin d'être persistantes. Les coroutines sont le moyen standard de quitter le thread principal en Kotlin. Toutefois, elles quittent également la mémoire à la fermeture de l'application. Pour les tâches persistantes, utilisez WorkManager.
Gestionnaire d'alarmes (AlarmManager) Alarmes uniquement. Contrairement à WorkManager, AlarmManager active un appareil en mode Sommeil. Il n'est donc pas efficace en termes d'alimentation et de gestion des ressources. Utilisez-le uniquement pour des alarmes ou des notifications précises, telles que des événements d'agenda, et non pour des tâches en arrière-plan.

Remplacer les API obsolètes

L'API WorkManager est recommandée pour remplacer toutes les API de planification en arrière-plan Android précédentes, y compris FirebaseJobDispatcher, GcmNetworkManager et JobScheduler.

Premiers pas

Consultez le guide de démarrage pour commencer à utiliser WorkManager dans votre application.

Ressources supplémentaires

Vous trouverez des ressources supplémentaires dans les sections suivantes.

Vidéos

Blogs

Exemples