JobScheduler to systemowa usługa Androida, wprowadzona w API 21 (Android 5.0 Lollipop), która pozwala aplikacjom planować wykonywanie zadań w tle na podstawie określonych warunków. W przeciwieństwie do AlarmManager, JobScheduler nie wymaga dokładnego czasu uruchomienia — system sam określa optymalny moment, łącząc wymagania aplikacji z bieżącym stanem urządzenia. Według Android Developers, 2026, usługa obsługuje kryteria dotyczące sieci, ładowania, stanu pamięci i bezczynności urządzenia.
Najważniejsze
JobScheduler to systemowa usługa Androida, która łączy kilka zadań w tle w pakiety w celu zmniejszenia zużycia energii. Zamiast każda aplikacja budzić urządzenie do wykonania swojego zadania, JobScheduler grupuje je i wykonuje w optymalnym momencie, gdy urządzenie jest już aktywne. Znacznie wydłuża to czas pracy na baterii.
Przed pojawieniem się JobScheduler programiści używali AlarmManager i BroadcastReceiver do zadań w tle. Problemem tego podejścia było to, że każda aplikacja niezależnie budziła urządzenie, co prowadziło do szybkiego rozładowania baterii. JobScheduler rozwiązał ten problem, wprowadzając okno wsadowego wykonania, w ramach którego system uruchamia wszystkie zaplanowane zadania różnych aplikacji jednocześnie.
Zasada działania opiera się na obiekcie JobInfo, który aplikacja przekazuje do JobScheduler. System zapisuje zadanie i uruchamia je, gdy spełnione są wszystkie określone warunki. W przeciwieństwie do WorkManager, JobScheduler nie gwarantuje ponownego uruchomienia w przypadku awarii — jeśli zadanie zakończy się wyjątkiem, programista musi samodzielnie zaplanować je ponownie.
JobScheduler używa architektury opartej na JobService i JobInfo. JobInfo opisuje zadanie i jego warunki, JobService zawiera logikę wykonania. Aplikacja rejestruje zadanie przez getSystemService(JobScheduler.class) i wywołuje schedule(jobInfo). System przejmuje planowanie.
JobService to abstrakcyjna klasa dziedzicząca po Service. Zawiera dwie kluczowe metody: onStartJob (wywoływana przy uruchomieniu zadania) i onStopJob (wywoływana przy wymuszonym zatrzymaniu przez system). JobInfo jest tworzony przez Builder i zawiera wszystkie parametry zadania: identyfikator, warunki, ograniczenia czasowe.
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// Wykonywany na głównym wątku
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = kontynuacja pracy
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = przeplanuj zadanie
}
}
JobScheduler pozwala ustawić kilka kryteriów jednocześnie: typ sieci (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED), stan ładowania (requiresCharging), poziom naładowania (requiresBatteryNotLow), stan pamięci (requiresStorageNotLow) i tryb czuwania (requiresDeviceIdle). Zadanie uruchamia się tylko wtedy, gdy wszystkie kryteria są spełnione.
JobInfo.Builder zapewnia elastyczne ustawienia dla każdego zadania w tle. Odpowiednia kombinacja parametrów pozwala zrównoważyć terminowość wykonania i zużycie energii.
| Metoda | Opis | Przykład |
|---|---|---|
| setRequiredNetworkType | Wymagany typ sieci | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | Urządzenie na ładowaniu | true |
| setRequiresDeviceIdle | Urządzenie w trybie czuwania | true |
| setOverrideDeadline | Maksymalny czas oczekiwania (ms) | 300000 |
| setMinimumLatency | Minimalne opóźnienie (ms) | 60000 |
| setPeriodic | Wykonanie okresowe (ms) | 3600000 |
| setBackoffCriteria | Strategia ponawiania przy awarii | LINEAR / EXPONENTIAL |
Ważny parametr — setOverrideDeadline. Jeśli ustawisz deadline, system gwarantuje uruchomienie zadania do tego czasu, nawet jeśli nie wszystkie warunki są spełnione. Jest to przydatne dla zadań z krytycznym czasem wykonania, na przykład synchronizacja co 6 godzin.
Typowy scenariusz — synchronizacja danych przy połączeniu z Wi-Fi i ładowaniu urządzenia. Aplikacja tworzy JobInfo z odpowiednimi kryteriami i przekazuje go do JobScheduler. System uruchamia zadanie po spełnieniu sprzyjających warunków.
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 godzin
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobService musi być zarejestrowany w AndroidManifest.xml z uprawnieniem BIND_JOB_SERVICE. W metodzie onStartJob ważne jest wywołanie jobFinished po zakończeniu pracy — w przeciwnym razie system będzie uważał zadanie za wykonywane w nieskończoność i może je wymusić zatrzymać.
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler ma szereg ograniczeń. Po pierwsze, jest dostępny tylko na Android 5+ — dla starszych wersji wymagana jest alternatywa. Po drugie, system może opóźniać zadania aplikacji, które są rzadko używane, szczególnie na Android 9+ z funkcją App Standby Buckets. Po trzecie, JobScheduler nie zapewnia mechanizmu gwarantowanego ponownego uruchomienia w przypadku awarii.
Google zaleca używanie WorkManager zamiast bezpośredniego korzystania z JobScheduler. WorkManager używa JobScheduler pod maską na Android 5+, ale dodaje obsługę starszych wersji, gwarancję wykonania, łańcuchy zadań i monitorowanie stanu przez LiveData. Jeśli aplikacja obsługuje tylko Android 8+ i nie wymaga złożonej logiki zadań w tle, JobScheduler nadal może być uzasadniony.
Do debugowania JobScheduler użyj dumpsys jobscheduler przez ADB: polecenie pokazuje wszystkie zaplanowane zadania, ich status, pozostały czas i historię wykonania. Dla konkretnej aplikacji: adb shell dumpsys jobscheduler | grep nazwa_pakietu. Pozwala to sprawdzić, czy zadanie jest zarejestrowane, jakie warunki są ustawione i dlaczego nie jest uruchamiane. Dostępny jest również JobScheduler.getPendingJob() do programowego sprawdzania statusu zadania. Dodatkowo można użyć Android Studio Profiler do analizy zużycia energii podczas wykonywania zadań. Dla aplikacji na Android 5+ JobScheduler pozostaje niezawodnym narzędziem do nieprecyzyjnych zadań w tle z warunkami sieci i ładowania.
Domyślnie JobService wykonuje się w głównym wątku, dlatego wszystkie operacje blokujące wymagają utworzenia osobnego wątku lub użycia AsyncTask. JobScheduler nie zapewnia wbudowanej puli wątków, w przeciwieństwie do WorkManager. Programista sam zarządza wątkami i synchronizacją. Zaleca się używanie ThreadPoolExecutor dla zadań równoległych i Handler do komunikacji z głównym wątkiem. W onStopJob ważne jest prawidłowe przerywanie działających wątków, aby uniknąć wycieków.
JobScheduler obsługuje zadania okresowe przez metodę setPeriodic(long intervalMillis). Minimalny interwał wynosi 15 minut. Jednak w przeciwieństwie do WorkManager, JobScheduler nie gwarantuje dokładnego przestrzegania interwału — system może przesuwać wykonanie w celu grupowania z innymi zadaniami. Metoda setPeriodic nie obsługuje również flex-interwału (elastyczne okno), który pojawił się w późniejszych wersjach API. Do dokładnego okresowego wykonywania używaj AlarmManager w kombinacji z BroadcastReceiver.
Począwszy od Android 9, Google wprowadził App Standby Buckets, który klasyfikuje aplikacje według częstotliwości używania: Active, Working Set, Frequent, Rare. Aplikacje w kategorii Rare doświadczają opóźnień wykonania zadań JobScheduler do 24 godzin. Programiści mogą wpływać na kategorię tylko przez jakość aplikacji — mechanizmy systemowe automatycznie podnoszą priorytet aplikacji, z którymi użytkownik regularnie współpracuje. JobScheduler uwzględnia tę klasyfikację, a zadanie aplikacji z Rare zostanie wykonane tylko w oknie serwisowym. Dla aplikacji z kategorii Active (najczęściej używane) opóźnienia są minimalne, a zadania wykonywane praktycznie natychmiast po spełnieniu warunków.
Do zadań okresowych z dokładnym czasem uruchomienia JobScheduler nie nadaje się — użyj AlarmManager. Do krótkich jednorazowych zadań — Foreground Service z powiadomieniem. JobScheduler jest optymalny dla zadań, gdzie ważna jest efektywność energetyczna, a nie dokładność czasu: synchronizacja, pobieranie aktualizacji, wsadowe przetwarzanie danych. Właściwy wybór narzędzia pracy w tle bezpośrednio wpływa na doświadczenie użytkownika i czas pracy urządzenia na baterii. Ostateczne rozwiązanie — JobScheduler do wsadowego przetwarzania z warunkami, AlarmManager do zadań zgodnie z harmonogramem, WorkManager jako uniwersalny planista.
Często zadawane pytania
Tak, JobScheduler grupuje zadania z różnych aplikacji w pakiety i wykonuje je razem. To kluczowa zaleta w porównaniu z AlarmManager: zamiast każda aplikacja budzić urządzenie osobno, system budzi procesor raz i przetwarza wszystkie zaplanowane zadania.
Jeśli wywołanie jobFinished nie zostało wykonane w rozsądnym czasie, system może wymusić wywołanie onStopJob i zakończyć zadanie. Zaleca się zmieścić w kilku minutach dla jednego zadania i zawsze wywoływać jobFinished po zakończeniu.
W Doze Mode JobScheduler odkłada wszystkie zadania do następnego okna serwisowego (maintenance window), które pojawia się okresowo. Użycie setOverrideDeadline gwarantuje, że zadanie zostanie wykonane z uwzględnieniem tych okien, ale niekoniecznie o dokładnym czasie.
WorkManager to biblioteka, która pod maską używa JobScheduler na Android 5+. WorkManager dodaje gwarancję wykonania, obsługę starszych wersji (API 14+), łańcuchy Worker-ów, monitorowanie stanu przez LiveData/Flow i automatyczne ponawianie przy awariach.
Do anulowania użyj scheduler.cancel(JOB_ID) dla konkretnego zadania lub scheduler.cancelAll() dla wszystkich zadań aplikacji. Upewnij się, że Job ID zgadza się z podanym przy tworzeniu JobInfo, w przeciwnym razie zadanie nie zostanie anulowane.
Programiści muszą zrozumieć, że JobScheduler to niskopoziomowe systemowe API, przeznaczone dla doświadczonych zespołów, które chcą pełnej kontroli nad zadaniami w tle urządzenia. Dla większości aplikacji WorkManager zapewnia tę samą funkcjonalność z prostszym, bezpieczniejszym i nowoczesnym API dla Androida.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również