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 package_name. Це дозволяє перевірити, чи зареєстровано завдання, які умови задано та чому воно не запускається. Також доступний JobScheduler.getPendingJob() для програмної перевірки статусу завдання. Додатково можна використовувати Android Studio Profiler для аналізу енергоспоживання при виконанні завдань. Для додатків на Android 5+ JobScheduler залишається надійним інструментом для неточних фонових завдань з умовами по мережі та заряду.
За замовчуванням JobService виконується в головному потоці, тому всі блокуючі операції потребують створення окремого потоку або використання AsyncTask. JobScheduler не надає вбудованого пулу потоків, на відміну від WorkManager. Розробник самостійно керує потоками та синхронізацією. Рекомендується використовувати ThreadPoolExecutor для паралельних завдань та Handler для комунікації з головним потоком. В onStopJob важливо коректно переривати працюючі потоки, щоб уникнути витоків.
JobScheduler підтримує періодичні завдання через метод setPeriodic(long intervalMillis). Мінімальний інтервал становить 15 хвилин. Однак, на відміну від WorkManager, JobScheduler не гарантує точне дотримання інтервалу — система може зсувати виконання для групування з іншими завданнями. Метод setPeriodic також не підтримує гнучкий інтервал (гнучке вікно), який з'явився в пізніших версіях 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також