JobScheduler est un service système Android, présenté dans l'API 21 (Android 5.0 Lollipop), qui permet aux applications de planifier l'exécution de tâches en arrière-plan sur la base de conditions définies. Contrairement à AlarmManager, JobScheduler ne nécessite pas d'heure d'exécution précise — le système détermine lui-même le moment optimal en combinant les exigences de l'application avec l'état actuel de l'appareil. Selon Android Developers, 2026, le service prend en charge les critères de réseau, de charge, d'état de stockage et d'inactivité de l'appareil.
Points clés
JobScheduler est un service système Android qui regroupe plusieurs tâches en arrière-plan en lots pour réduire la consommation d'énergie. Au lieu que chaque application réveille l'appareil pour exécuter sa propre tâche, JobScheduler les regroupe et les exécute au moment optimal lorsque l'appareil est déjà actif. Cela prolonge considérablement la durée de vie de la batterie.
Avant JobScheduler, les développeurs utilisaient AlarmManager et BroadcastReceiver pour les tâches en arrière-plan. Le problème de cette approche était que chaque application réveillait l'appareil indépendamment, ce qui entraînait un épuisement rapide de la batterie. JobScheduler a résolu ce problème en introduisant une fenêtre d'exécution par lots, dans laquelle le système lance toutes les tâches planifiées de différentes applications simultanément.
Le principe de fonctionnement est basé sur un objet JobInfo que l'application transmet à JobScheduler. Le système sauvegarde la tâche et l'exécute lorsque toutes les conditions spécifiées sont remplies. Contrairement à WorkManager, JobScheduler ne garantit pas le redémarrage en cas d'échec — si une tâche lève une exception, le développeur doit la reprogrammer manuellement.
JobScheduler utilise une architecture basée sur JobService et JobInfo. JobInfo décrit la tâche et ses conditions, JobService contient la logique d'exécution. L'application enregistre la tâche via getSystemService(JobScheduler.class) et appelle schedule(jobInfo). Le système se charge de la planification.
JobService est une classe abstraite qui étend Service. Elle possède deux méthodes clés : onStartJob (appelée au démarrage de la tâche) et onStopJob (appelée lorsque le système arrête la tâche de force). JobInfo est créé via le Builder et contient tous les paramètres de la tâche : identifiant, conditions, contraintes de temps.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// S'exécute sur le thread principal
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = le travail continue
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = reprogrammer la tâche
}
}
JobScheduler permet de définir plusieurs critères simultanément : type de réseau (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), état de charge (requiresCharging), niveau de batterie (requiresBatteryNotLow), état de stockage (requiresStorageNotLow) et mode veille (requiresDeviceIdle). La tâche n'est exécutée que lorsque tous les critères sont remplis.
JobInfo.Builder fournit des paramètres flexibles pour chaque tâche en arrière-plan. La bonne combinaison de paramètres permet d'équilibrer la rapidité d'exécution et la consommation d'énergie.
| Méthode | Description | Exemple |
|---|---|---|
| setRequiredNetworkType | Type de réseau requis | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Appareil en charge | true |
| setRequiresDeviceIdle | Appareil inactif | true |
| setOverrideDeadline | Temps d'attente maximum (ms) | 300000 |
| setMinimumLatency | Retard minimum (ms) | 60000 |
| setPeriodic | Exécution périodique (ms) | 3600000 |
| setBackoffCriteria | Stratégie de nouvelle tentative en cas d'échec | LINEAR / EXPONENTIAL |
Un paramètre important est setOverrideDeadline. Si un délai est spécifié, le système garantit que la tâche sera exécutée d'ici ce moment, même si toutes les conditions ne sont pas remplies. Ceci est utile pour les tâches à temps critique, comme la synchronisation toutes les 6 heures.
Un scénario typique est la synchronisation des données lors de la connexion au Wi-Fi et de la charge de l'appareil. L'application crée un JobInfo avec les critères correspondants et le transmet à JobScheduler. Le système exécute la tâche lorsque les conditions favorables sont réunies.
ComponentName serviceName = new ComponentName(this, SyncJobService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID_SYNC, serviceName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setOverrideDeadline(6 * 60 * 60 * 1000) // 6 heures
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
Le JobService doit être enregistré dans AndroidManifest.xml avec l'autorisation BIND_JOB_SERVICE. Dans la méthode onStartJob, il est important d'appeler jobFinished après avoir terminé le travail — sinon, le système considérera que la tâche s'exécute indéfiniment et pourra l'arrêter de force.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler présente plusieurs limitations. Premièrement, il n'est disponible que sur Android 5+ — les versions plus anciennes nécessitent une alternative. Deuxièmement, le système peut différer les tâches des applications rarement utilisées, surtout sur Android 9+ avec App Standby Buckets. Troisièmement, JobScheduler ne fournit pas de mécanisme de redémarrage garanti en cas d'échec.
Google recommande d'utiliser WorkManager au lieu d'utiliser JobScheduler directement. WorkManager utilise JobScheduler en interne sur Android 5+, mais ajoute la prise en charge des anciennes versions, la garantie d'exécution, les chaînes de tâches et l'observation d'état via LiveData. Si votre application ne prend en charge qu'Android 8+ et ne nécessite pas de logique complexe de tâches en arrière-plan, JobScheduler peut encore être justifié.
Pour déboguer JobScheduler, utilisez dumpsys jobscheduler via ADB : la commande affiche toutes les tâches planifiées, leur statut, le temps restant et l'historique d'exécution. Pour une application spécifique : adb shell dumpsys jobscheduler | grep package_name. Cela permet de vérifier si la tâche est enregistrée, quelles conditions sont définies et pourquoi elle ne s'exécute pas. Vous pouvez également utiliser JobScheduler.getPendingJob() pour vérifier programmatiquement le statut de la tâche. De plus, Android Studio Profiler peut être utilisé pour analyser la consommation d'énergie lors de l'exécution des tâches. Pour les applications sur Android 5+, JobScheduler reste un outil fiable pour les tâches en arrière-plan imprécises avec des conditions de réseau et de charge.
Par défaut, JobService s'exécute sur le thread principal, donc toutes les opérations bloquantes nécessitent la création d'un thread séparé ou l'utilisation d'AsyncTask. Contrairement à WorkManager, JobScheduler ne fournit pas de pool de threads intégré. Le développeur gère les threads et la synchronisation de manière indépendante. Il est recommandé d'utiliser ThreadPoolExecutor pour les tâches parallèles et Handler pour la communication avec le thread principal. Dans onStopJob, il est important d'interrompre correctement les threads en cours d'exécution pour éviter les fuites.
JobScheduler prend en charge les tâches périodiques via la méthode setPeriodic(long intervalMillis). L'intervalle minimum est de 15 minutes. Cependant, contrairement à WorkManager, JobScheduler ne garantit pas le respect exact de l'intervalle — le système peut décaler l'exécution pour la regrouper avec d'autres tâches. La méthode setPeriodic ne prend pas non plus en charge un intervalle flexible (fenêtre flexible), apparu dans les versions ultérieures de l'API. Pour une exécution périodique précise, utilisez AlarmManager en combinaison avec BroadcastReceiver.
À partir d'Android 9, Google a introduit App Standby Buckets, qui classe les applications par fréquence d'utilisation : Active, Working Set, Frequent, Rare. Les applications de la catégorie Rare subissent des retards d'exécution des tâches JobScheduler allant jusqu'à 24 heures. Les développeurs ne peuvent influencer la catégorie que par la qualité de l'application — les mécanismes système augmentent automatiquement la priorité des applications avec lesquelles l'utilisateur interagit régulièrement. JobScheduler tient compte de cette classification, et une tâche d'une application Rare ne sera exécutée que dans la fenêtre de maintenance. Pour les applications de la catégorie Active (les plus utilisées), les retards sont minimes et les tâches sont exécutées presque immédiatement lorsque les conditions sont remplies.
Pour les tâches périodiques avec une heure précise, JobScheduler n'est pas adapté — utilisez AlarmManager. Pour les tâches courtes uniques — Foreground Service avec notification. JobScheduler est optimal pour les tâches où l'efficacité énergétique est plus importante que la précision horaire : synchronisation, téléchargement de mises à jour, traitement par lots de données. Le choix correct de l'outil de travail en arrière-plan affecte directement l'expérience utilisateur et l'autonomie de la batterie de l'appareil. La conclusion finale : utilisez JobScheduler pour le traitement par lots avec conditions, AlarmManager pour les tâches planifiées et WorkManager comme planificateur universel.
Foire aux questions
Oui, JobScheduler regroupe les tâches de différentes applications en lots et les exécute ensemble. C'est un avantage clé par rapport à AlarmManager : au lieu que chaque application réveille l'appareil séparément, le système réveille le processeur une fois et traite toutes les tâches planifiées.
Si jobFinished n'a pas été appelé dans un délai raisonnable, le système peut appeler de force onStopJob et terminer la tâche. Il est recommandé de terminer une seule tâche en quelques minutes et d'appeler toujours jobFinished à la fin.
En mode Doze, JobScheduler reporte toutes les tâches jusqu'à la prochaine fenêtre de maintenance, qui se produit périodiquement. L'utilisation de setOverrideDeadline garantit que la tâche sera exécutée en tenant compte de ces fenêtres, mais pas nécessairement à une heure précise.
WorkManager est une bibliothèque qui utilise JobScheduler en interne sur Android 5+. WorkManager ajoute une garantie d'exécution, la prise en charge des anciennes versions (API 14+), des chaînes de Workers, l'observation d'état via LiveData/Flow et une nouvelle tentative automatique en cas d'échec.
Pour annuler, utilisez scheduler.cancel(JOB_ID) pour une tâche spécifique ou scheduler.cancelAll() pour toutes les tâches de l'application. Assurez-vous que l'ID de tâche correspond à celui spécifié lors de la création de JobInfo, sinon la tâche ne sera pas annulée.
Les développeurs doivent comprendre que JobScheduler est une API système de bas niveau conçue pour les équipes expérimentées qui souhaitent un contrôle total sur les tâches en arrière-plan de l'appareil. Pour la plupart des applications, WorkManager offre les mêmes fonctionnalités avec une API plus simple, plus sûre et plus moderne pour Android.
Résumé
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.
Lisez aussi