JobScheduler: суштина, API и планирање задатака

Аутор: IT Sectr Објављено: 2026-03-27 Време читања: 8 мин

JobScheduler је системски сервис Android-а, представљен у API 21 (Android 5.0 Lollipop), који омогућава апликацијама да планирају извршавање позадинских задатака на основу задатих услова. За разлику од AlarmManager-а, JobScheduler не захтева тачно време покретања — систем сам одређује оптимални тренутак, комбинујући захтеве апликације са тренутним стањем уређаја. Према Android Developers, 2026, сервис подржава критеријуме за мрежу, пуњење, стање складишта и неактивност уређаја.

Главне ствари

  • JobScheduler је системски API Android 5+ за пакетну обраду позадинских задатака са условима покретања.
  • JobService је основна класа за обраду коју систем позива када су услови извршења испуњени.
  • JobInfo је објекат који описује параметре задатка: тип мреже, пуњење батерије, рок и кашњење.
  • Критеријуми покретања укључују повезивање на Wi-Fi, пуњење, постојање слободног простора и неактивност уређаја.
  • WorkManager користи JobScheduler испод хаубе на Android 5+, нудећи API вишег нивоа.

Шта је JobScheduler?

JobScheduler је системски сервис Android-а који обједињује више позадинских задатака у пакете ради смањења потрошње енергије. Уместо да свака апликација буди уређај за извршење свог задатка, JobScheduler их групише и извршава у оптималном тренутку, када је уређај већ активан. Ово значајно продужава време рада батерије.

Пре појаве JobScheduler-а, програмери су користили AlarmManager и BroadcastReceiver за позадинске задатке. Проблем овог приступа — свака апликација је независно будила уређај, што је доводило до брзог пражњења батерије. JobScheduler је решио овај проблем увођењем пакетног прозора извршења, у оквиру кога систем покреће све планиране задатке различитих апликација истовремено.

Принцип рада се заснива на објекту JobInfo који апликација прослеђује JobScheduler-у. Систем чува задатак и покреће га када су испуњени сви наведени услови. За разлику од WorkManager-а, JobScheduler не гарантује поновно покретање у случају отказа — ако задатак падне са изузетком, програмер мора сам да га поново закаже.

Како ради JobScheduler?

JobScheduler користи архитектуру засновану на JobService и JobInfo. JobInfo описује задатак и његове услове, JobService садржи логику извршења. Апликација региструје задатак преко getSystemService(JobScheduler.class) и позива schedule(jobInfo). Систем преузима планирање.

JobService и JobInfo

JobService је апстрактна класа која наслеђује Service. Садржи два кључна метода: onStartJob (позива се при покретању задатка) и onStopJob (позива се при присилном заустављању од стране система). JobInfo се креира преко Builder-а и садржи све параметре задатка: идентификатор, услове, временска ограничења.

java
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

JobInfo.Builder пружа флексибилна подешавања за сваки позадински задатак. Правилна комбинација параметара омогућава балансирање између благовремености извршења и потрошње енергије.

МетодОписПример
setRequiredNetworkTypeПотребан тип мрежеNETWORK_TYPE_UNMETERED
setRequiresChargingУређај се пуниtrue
setRequiresDeviceIdleУређај у режиму мировањаtrue
setOverrideDeadlineМаксимално време чекања (мс)300000
setMinimumLatencyМинимално кашњење (мс)60000
setPeriodicПериодично извршење (мс)3600000
setBackoffCriteriaСтратегија понављања при отказуLINEAR / EXPONENTIAL

Важан параметар — setOverrideDeadline. Ако наведете рок, систем ће гарантовано покренути задатак до тог времена, чак и ако нису испуњени сви услови. Ово је корисно за задатке са критичним временом извршења, на пример, синхронизација сваких 6 сати.

Пример коришћења JobScheduler

Планирање задатка са више услова

Типичан сценарио — синхронизација података при повезивању на Wi-Fi и пуњењу уређаја. Апликација креира JobInfo са одговарајућим критеријумима и прослеђује га JobScheduler-у. Систем покреће задатак када наступе повољни услови.

java
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 у манифесту

JobService мора бити регистрован у AndroidManifest.xml са дозволом BIND_JOB_SERVICE. У методи onStartJob је важно позвати jobFinished након завршетка рада — у супротном систем ће сматрати да се задатак извршава бесконачно и може га присилно зауставити.

xml
<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-а

За отклањање грешака JobScheduler-а користите dumpsys jobscheduler преко ADB-а: команда приказује све планиране задатке, њихов статус, преостало време и историју извршења. За одређену апликацију: adb shell dumpsys jobscheduler | grep име_пакета. Ово омогућава проверу да ли је задатак регистрован, који услови су постављени и зашто се не покреће. Такође је доступан JobScheduler.getPendingJob() за програмску проверу статуса задатка. Додатно, можете користити Android Studio Profiler за анализу потрошње енергије при извршавању задатака. За апликације на Android 5+, JobScheduler остаје поуздан алат за непрецизне позадинске задатке са условима мреже и пуњења.

JobScheduler у више нитним сценаријима

Подразумевано, JobService се извршава у главној нити, стога све блокирајуће операције захтевају креирање посебне нити или коришћење AsyncTask-а. За разлику од WorkManager-а, JobScheduler не пружа уграђени базен нити. Програмер самостално управља нитима и синхронизацијом. Препоручује се коришћење ThreadPoolExecutor-а за паралелне задатке и Handler-а за комуникацију са главном нити. У onStopJob-у је важно правилно прекинути радне нити како би се избегло цурење меморије.

Периодични задаци путем JobScheduler-а

JobScheduler подржава периодичне задатке путем метода setPeriodic(long intervalMillis). Минимални интервал је 15 минута. Међутим, за разлику од WorkManager-а, JobScheduler не гарантује тачно поштовање интервала — систем може померити извршење ради груписања са другим задацима. Метод setPeriodic такође не подржава flex-интервал (флексибилни прозор) који се појавио у каснијим верзијама API-ја. За тачно периодично извршење користите AlarmManager у комбинацији са BroadcastReceiver-ом.

App Standby Buckets и утицај на JobScheduler

Почевши од 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 обједињује задатке различитих апликација?

Да, JobScheduler групише задатке различитих апликација у пакете и извршава их заједно. Ово је кључна предност у односу на AlarmManager: уместо да свака апликација буди уређај посебно, систем буди процесор једном и обрађује све планиране задатке.

Шта се дешава ако се задатак у JobService-у извршава предуго?

Ако позив jobFinished није направљен у разумном времену, систем може присилно позвати onStopJob и завршити задатак. Препоручује се да се задатак заврши у року од неколико минута и увек позове jobFinished по завршетку.

Како се JobScheduler понаша у Doze Mode-у?

У Doze Mode-у, JobScheduler одлаже све задатке до следећег прозора одржавања (maintenance window), који наступа периодично. Коришћење setOverrideDeadline гарантује да ће задатак бити извршен узимајући у обзир ове прозоре, али не нужно у тачно време.

По чему се JobScheduler разликује од WorkManager-а?

WorkManager је библиотека која испод хаубе користи JobScheduler на Android 5+. WorkManager додаје гаранцију извршења, подршку за старије верзије (API 14+), ланце Worker-а, праћење стања преко LiveData/Flow и аутоматско понављање при отказима.

Како отказати планирани задатак у JobScheduler-у?

За отказивање користите scheduler.cancel(JOB_ID) за одређени задатак или scheduler.cancelAll() за све задатке апликације. Уверите се да Job ID одговара оном наведеном при креирању JobInfo-а, у супротном задатак неће бити отказан.

Програмерима је важно да разумеју да је JobScheduler системски API ниског нивоа, намењен искусним тимовима који желе потпуну контролу над позадинским задацима уређаја. За већину апликација, WorkManager пружа исту функционалност са једноставнијим, сигурнијим и модернијим API-јем за Android.

Завршни преглед

  • JobScheduler је системски сервис Android 5+ за пакетно извршавање позадинских задатака са задатим условима.
  • Архитектура се гради око JobService (логика) и JobInfo (параметри), регистрованих преко AndroidManifest-а.
  • Критеријуми покретања укључују мрежу, пуњење, стање складишта и неактивност уређаја.
  • setOverrideDeadline је једини начин да се гарантује извршење задатка до одређеног времена.
  • Пакетно извршење обједињује задатке различитих апликација, смањујући укупну потрошњу енергије уређаја.
  • WorkManager је пожељна алтернатива са гаранцијом извршења и подршком за старије верзије Android-а.
  • Не користите JobScheduler за задатке са тачним временом — за то је погодан AlarmManager.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође