IntentService jest rozszerzeniem klasy Service o obsługę zadań przetwarzanych na w tle na dedykowanym wątku roboczym przy pomocy klasy Handler. Umożliwia wykonanie pracy w sposób asynchroniczny niezależnie od wątku głównego, jednakże obsługuje tylko jedno zadanie w danej chwili. Wysyłane żądania w postaci obiektu Intent zostają natychmiast obsłużone lub trafiają do kolejki oczekujących. Gdy cała kolejka zadań zostanie zrealizowana wówczas usługa automatycznie kończy pracę. Większość zdarzeń cyklu życia interfejsu użytkownika nie ma wpływu na działanie IntentService (w przeciwieństwie do AsyncTask). Przeznaczony jest przede wszystkim do prostych operacji w tle, które niekoniecznie wymagają reakcji interfejsu użytkownika na otrzymany rezultat.
Implementacja
Aby stworzyć komponent IntentService należy zdefiniować klasę rozszerzającą klasę IntentService, nadpisać metodę onHandleIntent odpowiedzialną za przechwytywanie żądań i podobnie jak przy klasycznej usłudze (Service) dodać do pliku manifestu (AndroidManifest).
Komunikacja
IntentService nie dostarcza mechanizmu odpowiedzi zwrotnej do klientów. W celu implementacji komunikacji do interfejsu użytkownika lub innych fragmentów kodu aplikacji można posłużyć się m.in. BroadcastReceiver lub szyną zdarzeń.
Ograniczenia
Poza koniecznością zapewnienia mechanizmu odpowiedzi zwrotnej do klienta oraz ograniczeniem przepływu pracy do jednego wątku należy uwzględnić także restrykcje procesów w tle dla Service (w tym IntentService) w wyniku których usługa musi działać w trybie foreground (inaczej zostanie po pewnym czasie zatrzymana). Rozwiązaniem tego problemu może być użycie JobIntentService lub wystartowanie usługi w trybie foreground (startForegroundService) i wyświetlenie notyfikacji z poziomu usługi (startForeground).
JobIntentService
JobIntentService w zależności od wersji systemu dobiera optymalną strategię wykonywania kolejki zadań w tle. W przypadku wersji systemu od Android Oreo zadania zostaną wykonane przy użyciu JobScheduler, natomiast dla starszych wersji usługa zostanie wywołana w standardowy sposób przy pomocy metody startService. Klasa rozszerzająca JobIntentService powinna nadpisać metodę onHandleWork w której będzie wykonywana praca (podobnie jak w onHandleIntent w IntentService). Klient dodaje zadanie do kolejki wywołując enqueueWork.