Service jest usługą dziąłającą w tle na głównym wątku aplikacji. Nie posiada interfejsu użytkownika i jest niezależny względem cyklu życia aktywności (Activity). Komponenty mogą związać się do serwisu w celu interakacji z nim. Wykorzystywany przede wszystkim do natychmiastowego wykonywania długich, powtarzalnych lub ciągłych zadań w tle implementowanych na wątku roboczym (np. pobieranie, przetwarzanie danych, odtwarzanie muzyki). Może zostać uruchomiony przez różne komponenty oraz przez inne aplikacje. Jest zdolny do kontynuowania pracy w tle nawet po wyjściu z aplikacji. Może rozpocząć działanie zarówno poprzez wystartowanie jak i podpięcie. Wyróżnia się trzy tryby działania serwisu: background, foreground i bound.
Ograniczenia
Ze względu na wykonywanie pracy całego serwisu na wątku głównym należy zaimplementować kosztowne zadania usługi w oparciu o wątki robocze lub jako alternatywę rozważyć wykorzystanie IntentService. W zależności od wybranego trybu działania serwisu trzeba uwzględnić także konieczność dostarczenia mechanizmu odpowiedzi zwrotnej do klienta oraz restrykcję systemu dla procesów działających w tle. Jeśli wykonywanie zadania ma sens tylko w ramach aktywnego danego ekranu czy też powiązane jest z cyklem życia komponentu należy zrezygnować z wykorzystania Service i użyć innych mechanizmów takich jak np. AsyncTask czy HandlerThread.
Implementacja
Aby stworzyć klasyczny serwis należy rozszerzyć klasę Service oraz dostarczyć implementację podpięcia serwisu i opcjonalnie nadpisać metody cyklu życia. Metoda onStartCommand wywoływana jest w wyniku żądania wystartowania serwisu przez startService lub startForegroundService, a onBind w sytuacji podpięcia serwisu przez bindService. Obie metody mogą zostać wykonane wielokrotnie w ramach działania serwisu. Metody cyklu życia onCreate i onDestroy wywoływane są jeden raz w momencie inicjalizacji i niszczenia serwisu niezależnie od tego czy został on wystartowany (startService) czy podpięty (bindService). Ponadto należy zadeklarować komponent serwisu w pliku AndroidManifest.
Background
Serwis w trybie background przeznaczony jest do wykonywania operacji, których wynik nie jest odnotowany przez użytkownika (np. krótkie zapytanie sieciowe). Wykorzystywany do zadań typu fire and forget, startowany za pomocą metody startService. Ze względu na nałożone ograniczenia systemowe (które nie pozwalają na działanie serwisu w tle bez wiedzy użytkownika) od wersji Android O serwis może działać tylko gdy aplikacja jest w trybie foreground. W przypadku wyjścia z aplikacji lub przeniesienia jej do tła działanie serwisu zostanie po pewnym czasie zatrzymane, chyba że zostanie on przeniesiony do trybu foreground.
Foreground
Tryb foreground wykorzystywany jest do wykonywania zadań zauważalnych przez użytkownika (np. odtwarzanie muzyki) i startowany jest za pomocą startForegroundService. Serwis działający jako foreground musi wyświetlać notyfikację (Notification) za pomocą metody startForeground, która informuje użytkownika o działaniu jakiegoś zadania w tle spełniając tym samym ograniczenia systemów od wersji Android O dla usług działających w tle (bez wiedzy użytkownika). Kontynuuje pracę także po wyjściu z aplikacji czy pomimo braku interakacji.
Bound
W momemencie podpięcia komponentu aplikacji do serwisu za pomocą metody bindService przechodzi on w tryb bound. Taki serwis dostarcza interfejs komunikacji między komponentem, a nim samym oraz umożliwia wysyłanie żądanie i odbieranie wyników. Jeśli nie został wcześniej wystartowany w standardowy sposób przez startService wówczas działa tak długo dopóki jest podpięty przynajmniej przez jeden komponent.