JobScheduler är en systemtjänst i Android som introducerades i API 21 (Android 5.0 Lollipop) och gör det möjligt för applikationer att schemalägga körning av bakgrundsuppgifter baserat på angivna villkor. Till skillnad från AlarmManager kräver JobScheduler ingen exakt starttid — systemet bestämmer själv den optimala tidpunkten genom att kombinera applikationens krav med enhetens aktuella tillstånd. Enligt Android Developers, 2026 stöder tjänsten kriterier för nätverk, laddning, lagringsstatus och enhetens inaktivitet.
Huvudpunkter
JobScheduler är en systemtjänst i Android som kombinerar flera bakgrundsuppgifter i batcher för att minska energiförbrukningen. Istället för att varje applikation väcker enheten för att utföra sin uppgift grupperar JobScheduler dem och kör dem vid den optimala tidpunkten när enheten redan är aktiv. Detta förlänger batteritiden avsevärt.
Innan JobScheduler kom använde utvecklare AlarmManager och BroadcastReceiver för bakgrundsuppgifter. Problemet med detta tillvägagångssätt — varje applikation väckte enheten oberoende, vilket ledde till snabb batteriurladdning. JobScheduler löste detta problem genom att införa ett batch-körningsfönster inom vilket systemet startar alla schemalagda uppgifter från olika applikationer samtidigt.
Arbetsprincipen är baserad på JobInfo-objektet som applikationen skickar till JobScheduler. Systemet sparar uppgiften och startar den när alla angivna villkor är uppfyllda. Till skillnad från WorkManager garanterar JobScheduler inte omstart vid fel — om en uppgift misslyckas med ett undantag måste utvecklaren själv schemalägga den igen.
JobScheduler använder en arkitektur baserad på JobService och JobInfo. JobInfo beskriver uppgiften och dess villkor, JobService innehåller körningslogiken. Applikationen registrerar uppgiften via getSystemService(JobScheduler.class) och anropar schedule(jobInfo). Systemet tar över schemaläggningen.
JobService är en abstrakt klass som ärver från Service. Den innehåller två viktiga metoder: onStartJob (anropas när uppgiften startar) och onStopJob (anropas vid tvångsstopp av systemet). JobInfo skapas via Builder och innehåller alla uppgiftsparametrar: identifierare, villkor, tidsbegränsningar.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Körs på huvudtråden
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = arbetet fortsätter
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = schemalägg om uppgiften
}
}
JobScheduler tillåter inställning av flera kriterier samtidigt: nätverkstyp (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), laddningsstatus (requiresCharging), batterinivå (requiresBatteryNotLow), lagringsstatus (requiresStorageNotLow) och vänteläge (requiresDeviceIdle). Uppgiften startas endast när alla kriterier är uppfyllda.
JobInfo.Builder ger flexibla inställningar för varje bakgrundsuppgift. Rätt kombination av parametrar möjliggör en balans mellan tidsenlig körning och energiförbrukning.
| Metod | Beskrivning | Exempel |
|---|---|---|
| setRequiredNetworkType | Krävd nätverkstyp | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Enheten laddas | true |
| setRequiresDeviceIdle | Enheten i vänteläge | true |
| setOverrideDeadline | Maximal väntetid (ms) | 300000 |
| setMinimumLatency | Minsta fördröjning (ms) | 60000 |
| setPeriodic | Periodisk körning (ms) | 3600000 |
| setBackoffCriteria | Försöksstrategi vid fel | LINEAR / EXPONENTIAL |
En viktig parameter — setOverrideDeadline. Om du anger en deadline garanterar systemet att uppgiften startas senast den tiden, även om inte alla villkor är uppfyllda. Detta är användbart för uppgifter med kritisk körtid, till exempel synkronisering var 6:e timme.
Typiskt scenario — datasynkronisering vid Wi-Fi-anslutning och laddning av enheten. Applikationen skapar en JobInfo med lämpliga kriterier och skickar den till JobScheduler. Systemet startar uppgiften när gynnsamma villkor uppstår.
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 timmar
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobService måste registreras i AndroidManifest.xml med behörigheten BIND_JOB_SERVICE. I onStartJob-metoden är det viktigt att anropa jobFinished efter slutfört arbete — annars kommer systemet att anta att uppgiften körs oändligt och kan tvångsstoppa den.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler har ett antal begränsningar. För det första är den endast tillgänglig på Android 5+ — för äldre versioner krävs ett alternativ. För det andra kan systemet fördröja uppgifter från applikationer som sällan används, särskilt på Android 9+ med funktionen App Standby Buckets. För det tredje tillhandahåller JobScheduler ingen mekanism för garanterad omstart vid fel.
Google rekommenderar att använda WorkManager istället för att direkt använda JobScheduler. WorkManager använder JobScheduler under huven på Android 5+, men lägger till stöd för äldre versioner, körningsgaranti, uppgiftskedjor och statusövervakning via LiveData. Om applikationen endast stöder Android 8+ och inte kräver komplex bakgrundsuppgiftslogik kan JobScheduler fortfarande vara motiverat.
För felsökning av JobScheduler, använd dumpsys jobscheduler via ADB: kommandot visar alla schemalagda uppgifter, deras status, återstående tid och körningshistorik. För en specifik applikation: adb shell dumpsys jobscheduler | grep paketnamn. Detta gör det möjligt att kontrollera om uppgiften är registrerad, vilka villkor som är inställda och varför den inte startas. JobScheduler.getPendingJob() finns också tillgängligt för programmatisk kontroll av uppgiftsstatus. Dessutom kan du använda Android Studio Profiler för att analysera energiförbrukning vid uppgiftskörning. För applikationer på Android 5+ förblir JobScheduler ett pålitligt verktyg för oprecisa bakgrundsuppgifter med nätverks- och laddningsvillkor.
Som standard körs JobService i huvudtråden, därför kräver alla blockerande operationer att en separat tråd skapas eller AsyncTask används. Till skillnad från WorkManager tillhandahåller JobScheduler ingen inbyggd trådpool. Utvecklaren hanterar trådar och synkronisering själv. Det rekommenderas att använda ThreadPoolExecutor för parallella uppgifter och Handler för kommunikation med huvudtråden. I onStopJob är det viktigt att korrekt avbryta körande trådar för att undvika läckor.
JobScheduler stöder periodiska uppgifter via metoden setPeriodic(long intervalMillis). Minsta intervall är 15 minuter. Men till skillnad från WorkManager garanterar JobScheduler inte exakt efterlevnad av intervallet — systemet kan flytta körningen för gruppering med andra uppgifter. Metoden setPeriodic stöder inte heller flex-intervall (flexibelt fönster) som dök upp i senare API-versioner. För exakt periodisk körning, använd AlarmManager i kombination med BroadcastReceiver.
Från och med Android 9 införde Google App Standby Buckets, som klassificerar applikationer efter användningsfrekvens: Active, Working Set, Frequent, Rare. Applikationer i kategorin Rare upplever förseningar i JobScheduler-uppgiftskörning på upp till 24 timmar. Utvecklare kan påverka kategorin endast genom applikationens kvalitet — systemmekanismer ökar automatiskt prioriteringen för applikationer som användaren regelbundet interagerar med. JobScheduler tar hänsyn till denna klassificering och uppgiften från en Rare-applikation kommer endast att köras i underhållsfönstret. För applikationer i kategorin Active (mest använda) är förseningarna minimala och uppgifter körs praktiskt taget omedelbart när villkoren är uppfyllda.
För periodiska uppgifter med exakt starttid är JobScheduler inte lämplig — använd AlarmManager. För korta engångsuppgifter — Foreground Service med notifiering. JobScheduler är optimal för uppgifter där energieffektivitet är viktigt, inte tidsnoggrannhet: synkronisering, nedladdning av uppdateringar, batchbearbetning av data. Rätt val av bakgrundsverktyg påverkar direkt användarupplevelsen och enhetens batteritid. Slutgiltigt beslut — JobScheduler för batchbearbetning med villkor, AlarmManager för schemalagda uppgifter, WorkManager som universell schemaläggare.
Vanliga frågor
Ja, JobScheduler grupperar uppgifter från olika applikationer i batcher och kör dem tillsammans. Detta är en viktig fördel jämfört med AlarmManager: istället för att varje applikation väcker enheten separat, väcker systemet processorn en gång och bearbetar alla schemalagda uppgifter.
Om anropet av jobFinished inte görs inom rimlig tid kan systemet tvångsanropa onStopJob och avsluta uppgiften. Det rekommenderas att slutföra en uppgift inom några minuter och alltid anropa jobFinished efter slutförande.
I Doze-läge skjuter JobScheduler upp alla uppgifter till nästa underhållsfönster (maintenance window) som kommer periodiskt. Användning av setOverrideDeadline garanterar att uppgiften körs med hänsyn till dessa fönster, men inte nödvändigtvis vid exakt tid.
WorkManager är ett bibliotek som under huven använder JobScheduler på Android 5+. WorkManager lägger till körningsgaranti, stöd för äldre versioner (API 14+), Worker-kedjor, statusövervakning via LiveData/Flow och automatisk återförsök vid fel.
För avbrytande använd scheduler.cancel(JOB_ID) för en specifik uppgift eller scheduler.cancelAll() för alla uppgifter i applikationen. Se till att uppgifts-ID matchar det som angavs vid skapandet av JobInfo, annars kommer uppgiften inte att avbrytas.
Det är viktigt för utvecklare att förstå att JobScheduler är ett lågnivå system-API avsett för erfarna team som vill ha full kontroll över enhetens bakgrundsuppgifter. För de flesta applikationer erbjuder WorkManager samma funktionalitet med ett enklare, säkrare och modernare API för Android.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också