JobScheduler је системски сервис Android-а, представљен у API 21 (Android 5.0 Lollipop), који омогућава апликацијама да планирају извршавање позадинских задатака на основу задатих услова. За разлику од AlarmManager-а, JobScheduler не захтева тачно време покретања — систем сам одређује оптимални тренутак, комбинујући захтеве апликације са тренутним стањем уређаја. Према Android Developers, 2026, сервис подржава критеријуме за мрежу, пуњење, стање складишта и неактивност уређаја.
Главне ствари
JobScheduler је системски сервис Android-а који обједињује више позадинских задатака у пакете ради смањења потрошње енергије. Уместо да свака апликација буди уређај за извршење свог задатка, JobScheduler их групише и извршава у оптималном тренутку, када је уређај већ активан. Ово значајно продужава време рада батерије.
Пре појаве JobScheduler-а, програмери су користили AlarmManager и BroadcastReceiver за позадинске задатке. Проблем овог приступа — свака апликација је независно будила уређај, што је доводило до брзог пражњења батерије. JobScheduler је решио овај проблем увођењем пакетног прозора извршења, у оквиру кога систем покреће све планиране задатке различитих апликација истовремено.
Принцип рада се заснива на објекту JobInfo који апликација прослеђује JobScheduler-у. Систем чува задатак и покреће га када су испуњени сви наведени услови. За разлику од WorkManager-а, JobScheduler не гарантује поновно покретање у случају отказа — ако задатак падне са изузетком, програмер мора сам да га поново закаже.
JobScheduler користи архитектуру засновану на JobService и JobInfo. JobInfo описује задатак и његове услове, JobService садржи логику извршења. Апликација региструје задатак преко getSystemService(JobScheduler.class) и позива schedule(jobInfo). Систем преузима планирање.
JobService је апстрактна класа која наслеђује Service. Садржи два кључна метода: onStartJob (позива се при покретању задатка) и onStopJob (позива се при присилном заустављању од стране система). JobInfo се креира преко Builder-а и садржи све параметре задатка: идентификатор, услове, временска ограничења.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Извршава се на главној нити
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = наставак рада
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = поново закажи задатак
}
}
JobScheduler омогућава постављање више критеријума истовремено: тип мреже (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), стање пуњења (requiresCharging), ниво батерије (requiresBatteryNotLow), стање складишта (requiresStorageNotLow) и режим мировања (requiresDeviceIdle). Задатак се покреће само када су сви критеријуми испуњени.
JobInfo.Builder пружа флексибилна подешавања за сваки позадински задатак. Правилна комбинација параметара омогућава балансирање између благовремености извршења и потрошње енергије.
| Метод | Опис | Пример |
|---|---|---|
| setRequiredNetworkType | Потребан тип мреже | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Уређај се пуни | true |
| setRequiresDeviceIdle | Уређај у режиму мировања | true |
| setOverrideDeadline | Максимално време чекања (мс) | 300000 |
| setMinimumLatency | Минимално кашњење (мс) | 60000 |
| setPeriodic | Периодично извршење (мс) | 3600000 |
| setBackoffCriteria | Стратегија понављања при отказу | LINEAR / EXPONENTIAL |
Важан параметар — setOverrideDeadline. Ако наведете рок, систем ће гарантовано покренути задатак до тог времена, чак и ако нису испуњени сви услови. Ово је корисно за задатке са критичним временом извршења, на пример, синхронизација сваких 6 сати.
Типичан сценарио — синхронизација података при повезивању на Wi-Fi и пуњењу уређаја. Апликација креира JobInfo са одговарајућим критеријумима и прослеђује га JobScheduler-у. Систем покреће задатак када наступе повољни услови.
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 сати
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobService мора бити регистрован у AndroidManifest.xml са дозволом BIND_JOB_SERVICE. У методи onStartJob је важно позвати jobFinished након завршетка рада — у супротном систем ће сматрати да се задатак извршава бесконачно и може га присилно зауставити.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler има низ ограничења. Прво, доступан је само на Android 5+ — за старије верзије потребна је алтернатива. Друго, систем може одлагати задатке апликација које се ретко користе, посебно на Android 9+ са функцијом App Standby Buckets. Треће, JobScheduler не пружа механизам гарантованог поновног покретања у случају отказа.
Google препоручује коришћење WorkManager-а уместо директног коришћења JobScheduler-а. WorkManager користи JobScheduler испод хаубе на Android 5+, али додаје подршку за старије верзије, гаранцију извршења, ланце задатака и праћење стања преко LiveData-е. Ако апликација подржава само Android 8+ и не захтева сложену логику позадинских задатака, JobScheduler још увек може бити оправдан.
За отклањање грешака JobScheduler-а користите dumpsys jobscheduler преко ADB-а: команда приказује све планиране задатке, њихов статус, преостало време и историју извршења. За одређену апликацију: adb shell dumpsys jobscheduler | grep име_пакета. Ово омогућава проверу да ли је задатак регистрован, који услови су постављени и зашто се не покреће. Такође је доступан JobScheduler.getPendingJob() за програмску проверу статуса задатка. Додатно, можете користити Android Studio Profiler за анализу потрошње енергије при извршавању задатака. За апликације на Android 5+, JobScheduler остаје поуздан алат за непрецизне позадинске задатке са условима мреже и пуњења.
Подразумевано, JobService се извршава у главној нити, стога све блокирајуће операције захтевају креирање посебне нити или коришћење AsyncTask-а. За разлику од WorkManager-а, JobScheduler не пружа уграђени базен нити. Програмер самостално управља нитима и синхронизацијом. Препоручује се коришћење ThreadPoolExecutor-а за паралелне задатке и Handler-а за комуникацију са главном нити. У onStopJob-у је важно правилно прекинути радне нити како би се избегло цурење меморије.
JobScheduler подржава периодичне задатке путем метода setPeriodic(long intervalMillis). Минимални интервал је 15 минута. Међутим, за разлику од WorkManager-а, JobScheduler не гарантује тачно поштовање интервала — систем може померити извршење ради груписања са другим задацима. Метод setPeriodic такође не подржава flex-интервал (флексибилни прозор) који се појавио у каснијим верзијама API-ја. За тачно периодично извршење користите AlarmManager у комбинацији са BroadcastReceiver-ом.
Почевши од Android 9, Google је увео App Standby Buckets, који класификује апликације према учесталости коришћења: Active, Working Set, Frequent, Rare. Апликације у категорији Rare доживљавају кашњења извршења задатака JobScheduler-а до 24 сата. Програмери могу утицати на категорију само кроз квалитет апликације — системски механизми аутоматски повећавају приоритет апликација са којима корисник редовно комуницира. JobScheduler узима у обзир ову класификацију, а задатак апликације из Rare ће бити извршен само у прозору одржавања. За апликације из категорије Active (најчешће коришћене) кашњења су минимална и задаци се извршавају практично одмах по испуњењу услова.
За периодичне задатке са тачним временом покретања JobScheduler није погодан — користите AlarmManager. За кратке једнократне задатке — Foreground Service са обавештењем. JobScheduler је оптималан за задатке где је енергетска ефикасност важнија од прецизности времена: синхронизација, преузимање ажурирања, пакетна обрада података. Правилан избор алата за позадински рад директно утиче на корисничко искуство и време трајања батерије уређаја. Коначна одлука — JobScheduler за пакетну обраду са условима, AlarmManager за задатке по распореду, WorkManager као универзални планер.
Често постављана питања
Да, JobScheduler групише задатке различитих апликација у пакете и извршава их заједно. Ово је кључна предност у односу на AlarmManager: уместо да свака апликација буди уређај посебно, систем буди процесор једном и обрађује све планиране задатке.
Ако позив jobFinished није направљен у разумном времену, систем може присилно позвати onStopJob и завршити задатак. Препоручује се да се задатак заврши у року од неколико минута и увек позове jobFinished по завршетку.
У Doze Mode-у, JobScheduler одлаже све задатке до следећег прозора одржавања (maintenance window), који наступа периодично. Коришћење setOverrideDeadline гарантује да ће задатак бити извршен узимајући у обзир ове прозоре, али не нужно у тачно време.
WorkManager је библиотека која испод хаубе користи JobScheduler на Android 5+. WorkManager додаје гаранцију извршења, подршку за старије верзије (API 14+), ланце Worker-а, праћење стања преко LiveData/Flow и аутоматско понављање при отказима.
За отказивање користите scheduler.cancel(JOB_ID) за одређени задатак или scheduler.cancelAll() за све задатке апликације. Уверите се да Job ID одговара оном наведеном при креирању JobInfo-а, у супротном задатак неће бити отказан.
Програмерима је важно да разумеју да је JobScheduler системски API ниског нивоа, намењен искусним тимовима који желе потпуну контролу над позадинским задацима уређаја. За већину апликација, WorkManager пружа исту функционалност са једноставнијим, сигурнијим и модернијим API-јем за Android.
Завршни преглед
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође