JobScheduler este un serviciu de sistem Android, introdus în API 21 (Android 5.0 Lollipop), care permite aplicațiilor să planifice execuția sarcinilor de fundal pe baza unor condiții specificate. Spre deosebire de AlarmManager, JobScheduler nu necesită un moment exact de pornire — sistemul însuși determină momentul optim, combinând cerințele aplicației cu starea curentă a dispozitivului. Potrivit Android Developers, 2026, serviciul suportă criterii privind rețeaua, încărcarea, starea stocării și inactivitatea dispozitivului.
Principalele puncte
JobScheduler este un serviciu de sistem Android care combină mai multe sarcini de fundal în loturi pentru a reduce consumul de energie. În loc ca fiecare aplicație să trezească dispozitivul pentru a-și executa sarcina, JobScheduler le grupează și le execută în momentul optim, când dispozitivul este deja activ. Acest lucru prelungește semnificativ durata de funcționare a bateriei.
Înainte de apariția JobScheduler, dezvoltatorii foloseau AlarmManager și BroadcastReceiver pentru sarcinile de fundal. Problema acestei abordări — fiecare aplicație trezea independent dispozitivul, ceea ce ducea la descărcarea rapidă a bateriei. JobScheduler a rezolvat această problemă prin introducerea ferestrei de execuție în lot, în cadrul căreia sistemul lansează toate sarcinile planificate ale diferitelor aplicații simultan.
Principiul de funcționare se bazează pe obiectul JobInfo pe care aplicația îl transmite către JobScheduler. Sistemul salvează sarcina și o lansează atunci când sunt îndeplinite toate condițiile specificate. Spre deosebire de WorkManager, JobScheduler nu garantează repornirea în caz de eșec — dacă sarcina a eșuat cu o excepție, dezvoltatorul trebuie să o reprogrameze singur.
JobScheduler folosește o arhitectură bazată pe JobService și JobInfo. JobInfo descrie sarcina și condițiile sale, JobService conține logica de execuție. Aplicația înregistrează sarcina prin getSystemService(JobScheduler.class) și apelează schedule(jobInfo). Sistemul preia planificarea.
JobService este o clasă abstractă care moștenește Service. Conține două metode cheie: onStartJob (apelată la pornirea sarcinii) și onStopJob (apelată la oprirea forțată de sistem). JobInfo este creat prin Builder și conține toți parametrii sarcinii: identificator, condiții, constrângeri de timp.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Se execută pe firul principal
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = continuă lucrul
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = reprogramează sarcina
}
}
JobScheduler permite setarea mai multor criterii simultan: tipul rețelei (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), starea de încărcare (requiresCharging), nivelul bateriei (requiresBatteryNotLow), starea stocării (requiresStorageNotLow) și modul de așteptare (requiresDeviceIdle). Sarcina este lansată doar când toate criteriile sunt îndeplinite.
JobInfo.Builder oferă setări flexibile pentru fiecare sarcină de fundal. Combinația corectă de parametri permite echilibrarea între execuția la timp și consumul de energie.
| Metodă | Descriere | Exemplu |
|---|---|---|
| setRequiredNetworkType | Tipul de rețea necesar | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Dispozitivul se încarcă | true |
| setRequiresDeviceIdle | Dispozitivul în modul de așteptare | true |
| setOverrideDeadline | Timpul maxim de așteptare (ms) | 300000 |
| setMinimumLatency | Întârzierea minimă (ms) | 60000 |
| setPeriodic | Execuție periodică (ms) | 3600000 |
| setBackoffCriteria | Strategia de reîncercare la eșec | LINEAR / EXPONENTIAL |
Un parametru important — setOverrideDeadline. Dacă setați un termen limită, sistemul garantează lansarea sarcinii până la acest moment, chiar dacă nu toate condițiile sunt îndeplinite. Acest lucru este util pentru sarcini cu timp critic de execuție, de exemplu, sincronizarea la fiecare 6 ore.
Scenariul tipic — sincronizarea datelor la conectarea la Wi-Fi și încărcarea dispozitivului. Aplicația creează un JobInfo cu criteriile corespunzătoare și îl transmite către JobScheduler. Sistemul lansează sarcina la îndeplinirea condițiilor favorabile.
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 ore
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobService trebuie înregistrat în AndroidManifest.xml cu permisiunea BIND_JOB_SERVICE. În metoda onStartJob este important să apelați jobFinished după finalizarea lucrului — altfel sistemul va considera că sarcina se execută la infinit și o poate opri forțat.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler are o serie de limitări. În primul rând, este disponibil doar pe Android 5+ — pentru versiunile mai vechi este necesară o alternativă. În al doilea rând, sistemul poate amâna sarcinile aplicațiilor care sunt rareori utilizate, în special pe Android 9+ cu funcția App Standby Buckets. În al treilea rând, JobScheduler nu oferă un mecanism de repornire garantată în caz de eșec.
Google recomandă utilizarea WorkManager în locul utilizării directe a JobScheduler. WorkManager folosește JobScheduler intern pe Android 5+, dar adaugă suport pentru versiunile vechi, garanția execuției, lanțuri de sarcini și monitorizarea stării prin LiveData. Dacă aplicația suportă doar Android 8+ și nu necesită o logică complexă a sarcinilor de fundal, JobScheduler poate fi încă justificat.
Pentru depanarea JobScheduler utilizați dumpsys jobscheduler prin ADB: comanda arată toate sarcinile planificate, starea lor, timpul rămas și istoricul execuției. Pentru o aplicație specifică: adb shell dumpsys jobscheduler | grep nume_pachet. Acest lucru permite verificarea dacă sarcina este înregistrată, ce condiții sunt setate și de ce nu este lansată. De asemenea, este disponibil JobScheduler.getPendingJob() pentru verificarea programatică a stării sarcinii. Suplimentar, puteți utiliza Android Studio Profiler pentru analiza consumului de energie în timpul execuției sarcinilor. Pentru aplicațiile pe Android 5+, JobScheduler rămâne un instrument fiabil pentru sarcinile de fundal neprecise cu condiții de rețea și încărcare.
Implicit, JobService se execută în firul principal, prin urmare toate operațiunile blocante necesită crearea unui fir separat sau utilizarea AsyncTask. Spre deosebire de WorkManager, JobScheduler nu oferă un pool de fire încorporat. Dezvoltatorul gestionează singur firele și sincronizarea. Se recomandă utilizarea ThreadPoolExecutor pentru sarcini paralele și Handler pentru comunicarea cu firul principal. În onStopJob este important să întrerupeți corect firele de execuție pentru a evita scurgerile de memorie.
JobScheduler suportă sarcini periodice prin metoda setPeriodic(long intervalMillis). Intervalul minim este de 15 minute. Totuși, spre deosebire de WorkManager, JobScheduler nu garantează respectarea exactă a intervalului — sistemul poate deplasa execuția pentru gruparea cu alte sarcini. Metoda setPeriodic nu suportă nici flex-intervalul (fereastra flexibilă) care a apărut în versiunile ulterioare ale API. Pentru execuția periodică exactă utilizați AlarmManager în combinație cu BroadcastReceiver.
Începând cu Android 9, Google a introdus App Standby Buckets, care clasifică aplicațiile după frecvența de utilizare: Active, Working Set, Frequent, Rare. Aplicațiile din categoria Rare experimentează întârzieri de execuție a sarcinilor JobScheduler de până la 24 de ore. Dezvoltatorii pot influența categoria doar prin calitatea aplicației — mecanismele sistemului cresc automat prioritatea aplicațiilor cu care utilizatorul interacționează regulat. JobScheduler ia în considerare această clasificare, iar sarcina aplicației din Rare va fi executată doar în fereastra de service. Pentru aplicațiile din categoria Active (cele mai frecvent utilizate) întârzierile sunt minime, iar sarcinile sunt executate practic imediat la îndeplinirea condițiilor.
Pentru sarcinile periodice cu moment exact de pornire, JobScheduler nu este potrivit — utilizați AlarmManager. Pentru sarcini scurte unice — Foreground Service cu notificare. JobScheduler este optim pentru sarcinile unde eficiența energetică este importantă, nu precizia timpului: sincronizare, descărcarea actualizărilor, procesarea în lot a datelor. Alegerea corectă a instrumentului de lucru în fundal influențează direct experiența utilizatorului și durata de funcționare autonomă a dispozitivului. Decizia finală — JobScheduler pentru procesarea în lot cu condiții, AlarmManager pentru sarcini programate, WorkManager ca planificator universal.
Întrebări frecvente
Da, JobScheduler grupează sarcinile de la diferite aplicații în loturi și le execută împreună. Acesta este avantajul cheie față de AlarmManager: în loc ca fiecare aplicație să trezească dispozitivul separat, sistemul trezește procesorul o dată și procesează toate sarcinile planificate.
Dacă apelul jobFinished nu a fost efectuat într-un timp rezonabil, sistemul poate apela forțat onStopJob și încheia sarcina. Se recomandă să vă încadrați în câteva minute pentru o sarcină și să apelați întotdeauna jobFinished la finalizare.
În Doze Mode, JobScheduler amână toate sarcinile până la următoarea fereastră de service (maintenance window), care apare periodic. Utilizarea setOverrideDeadline garantează că sarcina va fi executată ținând cont de aceste ferestre, dar nu neapărat la momentul exact.
WorkManager este o bibliotecă care intern folosește JobScheduler pe Android 5+. WorkManager adaugă garanția execuției, suportul pentru versiunile vechi (API 14+), lanțuri de Worker-i, monitorizarea stării prin LiveData/Flow și reîncercarea automată la eșecuri.
Pentru anulare utilizați scheduler.cancel(JOB_ID) pentru o sarcină specifică sau scheduler.cancelAll() pentru toate sarcinile aplicației. Asigurați-vă că Job ID corespunde cu cel specificat la crearea JobInfo, altfel sarcina nu va fi anulată.
Este important ca dezvoltatorii să înțeleagă că JobScheduler este o API de sistem de nivel scăzut, destinată echipelor experimentate care doresc control total asupra sarcinilor de fundal ale dispozitivului. Pentru majoritatea aplicațiilor, WorkManager oferă aceeași funcționalitate cu o API mai simplă, mai sigură și mai modernă pentru Android.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și