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 package_name. Це дозволяє перевірити, чи зареєстровано завдання, які умови задано та чому воно не запускається. Також доступний JobScheduler.getPendingJob() для програмної перевірки статусу завдання. Додатково можна використовувати Android Studio Profiler для аналізу енергоспоживання при виконанні завдань. Для додатків на Android 5+ JobScheduler залишається надійним інструментом для неточних фонових завдань з умовами по мережі та заряду.

JobScheduler в багатопотокових сценаріях

За замовчуванням JobService виконується в головному потоці, тому всі блокуючі операції потребують створення окремого потоку або використання AsyncTask. JobScheduler не надає вбудованого пулу потоків, на відміну від WorkManager. Розробник самостійно керує потоками та синхронізацією. Рекомендується використовувати ThreadPoolExecutor для паралельних завдань та Handler для комунікації з головним потоком. В onStopJob важливо коректно переривати працюючі потоки, щоб уникнути витоків.

Періодичні завдання через JobScheduler

JobScheduler підтримує періодичні завдання через метод setPeriodic(long intervalMillis). Мінімальний інтервал становить 15 хвилин. Однак, на відміну від WorkManager, JobScheduler не гарантує точне дотримання інтервалу — система може зсувати виконання для групування з іншими завданнями. Метод setPeriodic також не підтримує гнучкий інтервал (гнучке вікно), який з'явився в пізніших версіях 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також