WorkManager dostarcza prosty interfejs umożliwiający zarządzanie zadaniami wykonywanymi w tle, których realizacja może być odroczona w czasie i ograniczona wymaganiami stanu systemu. Gwarantuje ukończenie pracy niezależnie od cyklu życia aplikacji czy systemu dzięki lokalnej bazie danych, która zarządza informacjami i statusami zadań z kolejki. Automatycznie wykrywa spełnienie warunków wstępnych stanu systemu dokonując rozpoczęcia, wstrzymania lub wznowienia zadania co pozwala na optymalne zarządzanie użycia baterii czy transmisji danych. Realizuje prace w tle stosując najlepsze praktyki oraz zachowuje zgodność z ograniczeniami dla różnych wersji systemu. Ponadto umożliwia zaplanowanie nie tylko zadań jednorazowanych, ale także cyklicznych oraz złożonych łańcuchów zadań (sekwencyjncyh i asynchronicznych). WorkManager nie jest całkowicie nową implementacją lecz wykorzystuje funckjonalność samodzielnych mechanizmów takich jak m.in. JobScheduler, JobDispatcher, AlarmManager czy Executor, których użycie zależne jest od wersji systemu, stanu cyklu życia aplikacji i czasu wykonania.
Implementacja
Zadania są kolejkowane na instancji WorkManager poprzez przekazanie do metody enqueue obiektu typu WorkRequest odpowiedzialnego za stworzenie kompletnego zadania. W skład WorkRequest wchodzą m.in. zadanie (Worker), ograniczenia (Constraints), dane wejściowe czy kryteria wznowienia, powtarzalności i opóznienia pracy. Klasa Worker w metodzie doWork definiuje wykonywaną pracę oraz zwraca rezultat zadania.
Jeśli zadanie składa się z mniejszych procesów, które powinny zostać wykonane sekwencyjne lub asynchronicznie, a rezultat kolejnego zależy od poprzedniego wówczas należy wykorzystać mechanizm łańcucha zadań. Metoda budowniczego beginWith pozwala na asynchroniczne wywolanie grupy zadań początkowych natomiast then na sekwencyjne wywołanie kolejnych kroków. Łączenie argumentów wejściowych z grupy zadań poprzedzających możliwe jest dzięki InputMerger.
JobScheduler
JobScheduler pozwala na planowanie zadań w tle gwarantując ich ukończenie w nieokreślonej przyszłości. Wykonanie zadania jest uzależnione od warunków stanu systemu. Może się zdarzyć, że rozpoczęcie pracy będzie natychmiastowe lub pozostanie w oczekiwaniu na korzystny stan systemu umożliwiający podjęcie działania zgodnie z wymaganiami wstępnymi. Optymalizuje użycie baterii i pamięci w stosunku do innych kosztownych rozwiązań realizacji pracy w tle takich jak np. Service, AlarmManager czy BroadcastReceiver. Usługa JobScheduler jest jednak dostępna od wersji systemu Android L. Alernatywnym rozwiązaniem może być wykorzystanie FirebaseJobDispatcher (działa także poniżej Android L). Obie usługi działają w oparciu o JobService, którego zadaniem jest obsługa zdarzeń rozpoczęcia i zatrzymania pracy. Warunki wstępne deklarowane są w obiektach JobInfo lub Job, a zaplanowanie zadania odbywa się przy pomocy metody schedule.
AlarmManager
Zadaniem AlarmManager jest zapewnienie dostępu do usług alarmowych systemu, dzięki czemu możliwe jest zaplanowanie uruchomienia zadania w wybranym momencie w przyszłości. Gdy alarm się włącza wówczas przechwytywana jest zarejestrowana intencja (PendintIntent) i delegowana do miejsca docelowego, gdzie jest wykonywana (np. przez BroadcastReceiver). Emisja alarmu może być jednorazowa lub cykliczna i działa niezależnie od cyklu życia aplikacji.