JobScheduler is een Android-systeemdienst, geïntroduceerd in API 21 (Android 5.0 Lollipop), waarmee applicaties het uitvoeren van achtergrondtaken kunnen plannen op basis van bepaalde voorwaarden. In tegenstelling tot AlarmManager vereist JobScheduler geen exacte starttijd — het systeem bepaalt zelf het optimale moment door de vereisten van de applicatie te combineren met de huidige toestand van het apparaat. Volgens Android Developers, 2026 ondersteunt de dienst criteria voor netwerk, opladen, opslagstatus en inactiviteit van het apparaat.
Belangrijkste punten
JobScheduler is een Android-systeemdienst die meerdere achtergrondtaken in batches combineert om het energieverbruik te verminderen. In plaats van dat elke applicatie het apparaat afzonderlijk wekt, groepeert JobScheduler ze en voert ze uit op het optimale moment wanneer het apparaat al actief is. Dit verlengt de batterijduur aanzienlijk.
Voordat JobScheduler bestond, gebruikten ontwikkelaars AlarmManager en BroadcastReceiver voor achtergrondtaken. Het probleem van deze aanpak — elke applicatie wekte het apparaat onafhankelijk, wat leidde tot snelle ontlading van de batterij. JobScheduler loste dit probleem op door een batch-uitvoeringsvenster te introduceren, waarin het systeem alle geplande taken van verschillende applicaties tegelijkertijd start.
Het werkingsprincipe is gebaseerd op het JobInfo-object dat de applicatie aan JobScheduler doorgeeft. Het systeem slaat de taak op en start deze wanneer aan alle opgegeven voorwaarden is voldaan. In tegenstelling tot WorkManager garandeert JobScheduler geen herstart bij een fout — als een taak met een uitzondering faalt, moet de ontwikkelaar deze zelf opnieuw plannen.
JobScheduler gebruikt een architectuur gebaseerd op JobService en JobInfo. JobInfo beschrijft de taak en de voorwaarden, JobService bevat de uitvoeringslogica. De applicatie registreert de taak via getSystemService(JobScheduler.class) en roept schedule(jobInfo) aan. Het systeem neemt de planning over.
JobService is een abstracte klasse die overerft van Service. Het bevat twee belangrijke methoden: onStartJob (aangeroepen bij het starten van de taak) en onStopJob (aangeroepen bij gedwongen stopppen door het systeem). JobInfo wordt gemaakt via Builder en bevat alle taakparameters: identificatie, voorwaarden, tijdsbeperkingen.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Wordt uitgevoerd op de hoofdthread
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = werk gaat door
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = taak opnieuw plannen
}
}
JobScheduler maakt het mogelijk meerdere criteria tegelijk in te stellen: netwerktype (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), oplaadstatus (requiresCharging), batterijniveau (requiresBatteryNotLow), opslagstatus (requiresStorageNotLow) en standby-modus (requiresDeviceIdle). De taak wordt alleen gestart wanneer aan alle criteria is voldaan.
JobInfo.Builder biedt flexibele instellingen voor elke achtergrondtaak. De juiste combinatie van parameters maakt het mogelijk om een balans te vinden tussen tijdige uitvoering en energieverbruik.
| Methode | Beschrijving | Voorbeeld |
|---|---|---|
| setRequiredNetworkType | Vereist netwerktype | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Apparaat wordt opgeladen | true |
| setRequiresDeviceIdle | Apparaat in standby-modus | true |
| setOverrideDeadline | Maximale wachttijd (ms) | 300000 |
| setMinimumLatency | Minimale vertraging (ms) | 60000 |
| setPeriodic | Periodieke uitvoering (ms) | 3600000 |
| setBackoffCriteria | Herhaalstrategie bij fout | LINEAR / EXPONENTIAL |
Een belangrijke parameter — setOverrideDeadline. Als u een deadline instelt, garandeert het systeem dat de taak vóór die tijd wordt gestart, zelfs als niet aan alle voorwaarden is voldaan. Dit is handig voor taken met een kritieke uitvoeringstijd, bijvoorbeeld synchronisatie elke 6 uur.
Typisch scenario — gegevens synchroniseren bij Wi-Fi-verbinding en opladen van het apparaat. De applicatie maakt een JobInfo met de juiste criteria en geeft deze door aan JobScheduler. Het systeem start de taak wanneer aan de gunstige voorwaarden is voldaan.
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 uur
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobService moet worden geregistreerd in AndroidManifest.xml met de machtiging BIND_JOB_SERVICE. In de onStartJob-methode is het belangrijk om jobFinished aan te roepen na voltooiing van het werk — anders gaat het systeem ervan uit dat de taak oneindig wordt uitgevoerd en kan deze gedwongen worden gestopt.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler heeft een aantal beperkingen. Ten eerste is het alleen beschikbaar op Android 5+ — voor oudere versies is een alternatief nodig. Ten tweede kan het systeem taken van applicaties die zelden worden gebruikt uitstellen, vooral op Android 9+ met de functie App Standby Buckets. Ten derde biedt JobScheduler geen mechanisme voor gegarandeerde herstart bij een fout.
Google raadt aan WorkManager te gebruiken in plaats van direct JobScheduler te gebruiken. WorkManager gebruikt JobScheduler onder de motorkap op Android 5+, maar voegt ondersteuning voor oudere versies, uitvoeringsgarantie, taakketens en statusbewaking via LiveData toe. Als de applicatie alleen Android 8+ ondersteunt en geen complexe achtergrondtaaklogica vereist, kan JobScheduler nog steeds gerechtvaardigd zijn.
Gebruik voor het debuggen van JobScheduler dumpsys jobscheduler via ADB: de opdracht toont alle geplande taken, hun status, resterende tijd en uitvoeringsgeschiedenis. Voor een specifieke applicatie: adb shell dumpsys jobscheduler | grep pakketnaam. Dit maakt het mogelijk om te controleren of de taak is geregistreerd, welke voorwaarden zijn ingesteld en waarom deze niet wordt gestart. Ook is JobScheduler.getPendingJob() beschikbaar voor programmatische controle van de taakstatus. Daarnaast kunt u Android Studio Profiler gebruiken voor analyse van het energieverbruik tijdens taakuitvoering. Voor applicaties op Android 5+ blijft JobScheduler een betrouwbaar hulpmiddel voor onnauwkeurige achtergrondtaken met netwerk- en oplaadvoorwaarden.
Standaard wordt JobService uitgevoerd in de hoofdthread, daarom vereisen alle blokkerende bewerkingen het maken van een aparte thread of het gebruik van AsyncTask. In tegenstelling tot WorkManager biedt JobScheduler geen ingebouwde threadpool. De ontwikkelaar beheert zelf de threads en synchronisatie. Het wordt aanbevolen ThreadPoolExecutor te gebruiken voor parallelle taken en Handler voor communicatie met de hoofdthread. In onStopJob is het belangrijk om werkende threads correct te onderbreken om lekkage te voorkomen.
JobScheduler ondersteunt periodieke taken via de methode setPeriodic(long intervalMillis). Het minimale interval is 15 minuten. In tegenstelling tot WorkManager garandeert JobScheduler echter geen exacte naleving van het interval — het systeem kan de uitvoering verschuiven voor groepering met andere taken. De setPeriodic-methode ondersteunt ook geen flex-interval (flexibel venster) dat in latere API-versies verscheen. Gebruik voor exacte periodieke uitvoering AlarmManager in combinatie met BroadcastReceiver.
Vanaf Android 9 introduceerde Google App Standby Buckets, dat applicaties classificeert op basis van gebruiksfrequentie: Active, Working Set, Frequent, Rare. Applicaties in de categorie Rare ervaren vertragingen in de uitvoering van JobScheduler-taken tot 24 uur. Ontwikkelaars kunnen de categorie alleen beïnvloeden via de kwaliteit van de applicatie — systeemmechanismen verhogen automatisch de prioriteit van applicaties waarmee de gebruiker regelmatig interactie heeft. JobScheduler houdt rekening met deze classificatie en de taak van een Rare-applicatie wordt alleen uitgevoerd in het onderhoudsvenster. Voor applicaties in de categorie Active (meest gebruikte) zijn de vertragingen minimaal en worden taken vrijwel onmiddellijk uitgevoerd zodra aan de voorwaarden is voldaan.
Voor periodieke taken met een exacte starttijd is JobScheduler niet geschikt — gebruik AlarmManager. Voor korte eenmalige taken — Foreground Service met melding. JobScheduler is optimaal voor taken waar energie-efficiëntie belangrijker is dan tijdsnauwkeurigheid: synchronisatie, downloaden van updates, batchverwerking van gegevens. De juiste keuze van het achtergrondwerktuig beïnvloedt direct de gebruikerservaring en de batterijduur van het apparaat. De uiteindelijke beslissing — JobScheduler voor batchverwerking met voorwaarden, AlarmManager voor taken op schema, WorkManager als universele planner.
Veelgestelde vragen
Ja, JobScheduler groepeert taken van verschillende applicaties in batches en voert ze samen uit. Dit is een belangrijk voordeel ten opzichte van AlarmManager: in plaats van dat elke applicatie het apparaat afzonderlijk wekt, wekt het systeem de processor eenmaal en verwerkt alle geplande taken.
Als de aanroep van jobFinished niet binnen een redelijke tijd wordt gedaan, kan het systeem gedwongen onStopJob aanroepen en de taak beëindigen. Het wordt aanbevolen om binnen enkele minuten voor een taak te blijven en altijd jobFinished aan te roepen na voltooiing.
In Doze Mode stelt JobScheduler alle taken uit tot het volgende onderhoudsvenster (maintenance window), dat periodiek optreedt. Het gebruik van setOverrideDeadline garandeert dat de taak wordt uitgevoerd rekening houdend met deze vensters, maar niet noodzakelijk op exacte tijd.
WorkManager is een bibliotheek die onder de motorkap JobScheduler gebruikt op Android 5+. WorkManager voegt uitvoeringsgarantie, ondersteuning voor oudere versies (API 14+), Worker-ketens, statusbewaking via LiveData/Flow en automatische herhaling bij fouten toe.
Gebruik voor annulering scheduler.cancel(JOB_ID) voor een specifieke taak of scheduler.cancelAll() voor alle taken van de applicatie. Zorg ervoor dat de Job-ID overeenkomt met die bij het maken van JobInfo, anders wordt de taak niet geannuleerd.
Het is belangrijk dat ontwikkelaars begrijpen dat JobScheduler een laag-niveau systeem-API is, bedoeld voor ervaren teams die volledige controle willen over achtergrondtaken van het apparaat. Voor de meeste applicaties biedt WorkManager dezelfde functionaliteit met een eenvoudigere, veiligere en modernere API voor Android.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook