WorkManager — qu'est-ce que c'est, API et planification de tâches

Auteur : IT Sectr Publié le : 2026-03-27 Temps de lecture : 8 min

WorkManager est une bibliothèque Android Jetpack conçue pour exécuter des tâches différées et en arrière-plan avec une exécution garantie. Contrairement à Service ou JobScheduler, WorkManager gère le cycle de vie de la tâche : il la redémarre en cas d'échec, s'adapte à la version d'Android et prend en compte les contraintes de l'appareil. Selon Android Developers, 2026, WorkManager est la solution privilégiée pour la plupart des opérations en arrière-plan dans le développement Android moderne.

Points clés

  • WorkManager est une bibliothèque Jetpack pour les tâches en arrière-plan avec exécution garantie, quelle que soit la version d'Android.
  • Worker est la classe de base pour définir la logique d'une tâche en arrière-plan, que la bibliothèque exécute dans un thread séparé.
  • WorkRequest peut être unique (OneTimeWorkRequest) et périodique (PeriodicWorkRequest) avec un intervalle minimum de 15 minutes.
  • Les chaînes de tâches permettent d'organiser l'exécution séquentielle ou parallèle de plusieurs Workers.
  • Les contraintes définissent les conditions de démarrage : charge de la batterie, connexion réseau, état du stockage.

Qu'est-ce que WorkManager ?

WorkManager fait partie d'Android Jetpack, une bibliothèque pour gérer les tâches en arrière-plan qui doivent s'exécuter de manière garantie, que l'application soit au premier plan ou ait été fermée par l'utilisateur. La bibliothèque prend en charge API 14+ et sélectionne automatiquement le mécanisme d'exécution approprié : JobScheduler sur Android 5+, BroadcastReceiver + AlarmManager sur les versions plus anciennes.

La principale caractéristique de WorkManager est l'exécution garantie. Si une tâche n'a pas été terminée en raison d'un redémarrage de l'appareil, d'une fermeture de l'application ou d'un crash, WorkManager la redémarrera à la première occasion. Cela fait de la bibliothèque un choix idéal pour les tâches critiques : envoi d'analyses, synchronisation de base de données, téléchargement de journaux.

Contrairement à Background Service, WorkManager ne nécessite pas de gestion des threads et du cycle de vie. La bibliothèque elle-même crée un pool de threads, gère le Mode Doze, prend en compte la version d'Android et fournit une API unifiée quel que soit le niveau d'API. La prise en charge des coroutines et de RxJava est disponible via CoroutineWorker et RxWorker respectivement.

Observation de l'état via LiveData

WorkManager fournit une prise en charge intégrée de LiveData pour suivre l'état des tâches. La méthode getWorkInfoByIdLiveData renvoie LiveData<WorkInfo> qui est mise à jour à chaque changement d'état : ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Cela permet aux composants de l'interface utilisateur de réagir aux changements sans sondage manuel du planificateur et sans fuites de mémoire grâce aux composants Lifecycle-aware.

kotlin
WorkManager.getInstance(context)
    .getWorkInfoByIdLiveData(syncRequest.id)
    .observe(viewLifecycleOwner) { workInfo ->
        when (workInfo.state) {
            WorkInfo.State.SUCCEEDED ->
                showSuccess()
            WorkInfo.State.FAILED ->
                showError(workInfo.outputData)
            else ->
                showProgress()
        }
    }

Comment fonctionne WorkManager ?

L'architecture de WorkManager est construite autour de trois classes de base : Worker, WorkRequest et WorkManager. Worker contient la logique de la tâche, WorkRequest décrit les paramètres d'exécution et WorkManager gère la file d'attente et la planification. La bibliothèque utilise une base de données Room interne pour stocker l'état de toutes les tâches.

Worker et WorkRequest

Worker est une classe abstraite avec une seule méthode doWork qui est appelée sur un thread d'arrière-plan. La méthode renvoie ListenableWorker.Result — SUCCESS, FAILURE ou RETRY. WorkRequest lie le Worker avec les paramètres : délai d'attente, tag, délai initial et contraintes.

kotlin
class SyncWorker(
    context: Context,
    params: WorkerParameters
) : Worker(context, params) {

    override fun doWork(): Result {
        return try {
            val api = RetrofitClient.api
            val response = api.syncData()
            Result.success()
        } catch (e: Exception) {
            Result.retry()
        }
    }
}

Planification via WorkManager

WorkManager planifie les tâches de manière uniforme, quelle que soit la version d'Android. Lors de l'appel de enqueue, la bibliothèque enregistre la tâche dans Room, évalue les conditions actuelles et sélectionne le moment d'exécution optimal. En interne, il peut utiliser JobScheduler, AlarmManager ou son propre planificateur — le développeur n'a pas à s'en soucier.

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

Types de WorkRequest

WorkManager prend en charge deux types de demandes d'exécution : uniques et périodiques. Le choix du type dépend du scénario : la tâche doit s'exécuter une fois ou se répéter à un intervalle donné.

OneTimeWorkRequest

OneTimeWorkRequest est conçu pour les tâches qui doivent s'exécuter une seule fois. Il peut s'agir de l'envoi d'un journal, de la synchronisation des données après autorisation, du téléchargement de la configuration au premier démarrage. Le délai est défini via setInitialDelay et les contraintes via setConstraints.

PeriodicWorkRequest

PeriodicWorkRequest convient aux tâches répétitives avec un intervalle minimum de 15 minutes. La bibliothèque garantit que l'intervalle entre les exécutions ne sera pas inférieur à celui spécifié, mais peut être plus long en raison des contraintes de l'appareil. Pour les tâches avec une fréquence inférieure à 15 minutes, utilisez Handler ou Timer dans Foreground Service.

ParamètreOneTimeWorkRequestPeriodicWorkRequest
Fréquenceuniquerépétée (min. 15 min)
Quantité1 exécutionjusqu'à annulation
DélaisetInitialDelaysetInitialDelay
Chaînesprend en chargenon
Utilisationtéléchargement, synchronisationsurveillance, sondage

Configuration des contraintes et chaînes de tâches

Les contraintes dans WorkManager permettent de définir les conditions dans lesquelles une tâche peut être lancée : connexion réseau (NetworkType), niveau de batterie (batteryNotLow), état du stockage (StorageNotLow) et mode veille (DeviceIdle). La tâche ne démarrera pas tant que toutes les contraintes ne seront pas satisfaites.

kotlin
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .build()

val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
    .setConstraints(constraints)
    .build()

Les chaînes permettent d'organiser l'exécution séquentielle ou parallèle des tâches. beginWith démarre une chaîne, puis ajoute le Worker suivant qui s'exécutera après la réussite du précédent. Pour l'exécution parallèle, utilisez workManager.enqueue(listOf(request1, request2)).

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress -> upload -> cleanup séquentiellement

Migration de JobScheduler vers WorkManager

JobScheduler a été introduit dans Android 5 (API 21) en tant que service système pour planifier les tâches en arrière-plan. WorkManager est venu le remplacer, offrant une API multiplateforme avec migration automatique et des capacités supplémentaires : chaînes, garantie d'exécution, tags, observation d'état via LiveData.

Lors de la migration de JobScheduler vers WorkManager, vous devrez convertir JobService en Worker, remplacer JobInfo par WorkRequest et Context.getSystemService par l'API WorkManager. WorkManager gère automatiquement les problèmes de compatibilité et traite le Mode Doze plus correctement qu'une implémentation manuelle de JobScheduler. Étapes de migration : 1) créer une classe Worker, 2) construire un WorkRequest avec les mêmes conditions, 3) supprimer JobService et JobInfo du code et du manifeste.

UniqueWork pour les tâches uniques

WorkManager prend en charge le concept de tâches uniques via ExistingWorkPolicy. Si une tâche avec le nom spécifié existe déjà, la politique détermine le comportement : KEEP (ne pas en créer une nouvelle), REPLACE (remplacer l'existante), APPEND (ajouter à la fin de la chaîne) et APPEND_OR_REPLACE. UniqueWorkRequest est pratique pour les tâches qui ne doivent pas être dupliquées : synchronisation de base de données, téléchargement de configuration, envoi de lot d'analyses.

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

Gestion de la progression et des résultats intermédiaires

CoroutineWorker prend en charge le mécanisme setProgress, permettant de transmettre des résultats d'exécution intermédiaires. Ceci est utile pour les opérations longues : téléchargement de fichier volumineux, traitement par lot d'images, migration de base de données. L'interface utilisateur peut s'abonner aux mises à jour via getWorkInfosByTagLiveData et afficher la progression en temps réel. La méthode ForegroundInfo est également disponible pour exécuter un Worker en tant que Foreground Service avec une notification si la tâche doit être visible pour l'utilisateur.

kotlin
class ProgressWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        val total = 100
        for (i in 1..total) {
            setProgress(
                workDataOf("progress" to i)
            )
        }
        return Result.success()
    }
}

InputData et OutputData pour le transfert de données

WorkManager prend en charge le transfert de données entre Workers via InputData et OutputData. InputData est créé lors de la construction de WorkRequest via Data.Builder et est passé au Worker via inputData. Après l'exécution, le Worker crée OutputData via workDataOf ou Data.Builder et le renvoie avec Result.success(outputData). Le Worker suivant dans la chaîne reçoit l'outputData du précédent comme son inputData. Les données sont stockées au format clé-valeur avec prise en charge des types de base : String, Int, Long, Boolean, Double. La taille maximale de Data est de 10 Ko.

Dans la pratique, de nombreux projets utilisent WorkManager comme unique planificateur de tâches en arrière-plan. Google recommande de migrer tous les JobService existants vers WorkManager, en particulier dans les applications prenant en charge Android 4.4 (API 19) et inférieur, où JobScheduler n'est pas disponible et WorkManager utilise un mécanisme de secours via AlarmManager et BroadcastReceiver. Pour les tests, WorkManager fournit TestListenableWorkerBuilder et TestWorkerBuilder, qui permettent de tester les Workers dans des tests JUnit sans planificateur réel.

Pour tester WorkManager, utilisez TestListenableWorkerBuilder d'AndroidX Test, qui permet d'exécuter les Workers dans un environnement isolé et de vérifier le Result retourné. La bibliothèque fournit un support complet de JUnit et Robolectric pour les tests unitaires sans planificateur réel. Dans l'ensemble, WorkManager convient à 80% des tâches où Service ou JobScheduler étaient utilisés auparavant.

Foire aux questions

WorkManager garantit-il l'exécution de la tâche après un redémarrage de l'appareil ?

Oui, WorkManager garantit l'exécution même après un redémarrage. La bibliothèque enregistre toutes les tâches incomplètes dans une base de données Room et les restaure à l'aide de BroadcastReceiver qui se déclenche après le démarrage du système.

Quelle est la différence entre Worker, CoroutineWorker et RxWorker ?

Worker s'exécute sur un thread d'arrière-plan sans support de coroutines ou RxJava. CoroutineWorker utilise les coroutines Kotlin avec prise en charge des fonctions suspend et de l'annulation via le scope de coroutine. RxWorker fonctionne avec Observable et Single, adapté aux chaînes réactives.

Comment annuler une tâche dans WorkManager ?

Utilisez workManager.cancelWorkById(id) ou workManager.cancelAllWorkByTag("tag"). La bibliothèque fournit également la méthode cancelUniqueWork("name") pour annuler les tâches uniques avec le nom spécifié.

Quel est l'intervalle minimum pour PeriodicWorkRequest ?

L'intervalle minimum pour PeriodicWorkRequest est de 15 minutes. Cette limitation a été fixée par Google pour éviter une consommation excessive de la batterie. Si une tâche doit s'exécuter plus fréquemment, utilisez Foreground Service ou Handler avec une minuterie.

WorkManager prend-il en charge Android 4.4 et inférieur ?

Oui, WorkManager prend en charge API 14+. Sur les appareils sans JobScheduler (inférieur à API 21), la bibliothèque utilise une combinaison d'AlarmManager et BroadcastReceiver pour la planification des tâches. Cela fait de WorkManager une solution universelle pour les tâches en arrière-plan.

Résumé

  • WorkManager est une bibliothèque Jetpack moderne pour les tâches en arrière-plan avec exécution garantie sur toutes les versions d'Android.
  • Trois classes de base — Worker, WorkRequest et WorkManager — couvrent tous les scénarios de planification et d'exécution.
  • Deux types de demandes — OneTimeWorkRequest et PeriodicWorkRequest — pour les tâches uniques et répétitives.
  • Les contraintes (réseau, batterie, stockage) protègent la tâche de l'exécution dans des conditions défavorables.
  • Les chaînes de tâches assurent l'exécution séquentielle des Workers avec passage de résultats.
  • CoroutineWorker et RxWorker prennent en charge la programmation asynchrone via les coroutines et RxJava.
  • WorkManager remplace JobScheduler, Service et AlarmManager dans la plupart des scénarios de tâches en arrière-plan.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi