Czym jest service i jak działa w tworzeniu aplikacji?

Service to komponent Androida, który może wykonywać pracę bez własnego interfejsu użytkownika, na przykład odtwarzać muzykę, synchronizować dane lub prowadzić trwający transfer pliku. Razem z activities, broadcast receivers i content providers services są jednym z czterech podstawowych komponentów aplikacji w Androidzie i, podobnie jak pozostałe, muszą zostać zarejestrowane w pliku AndroidManifest.xml aplikacji. Domyślnie service działa w głównym wątku aplikacji, więc ciężką pracę i tak trzeba przenieść do wątku w tle.

Android rozróżnia started services, które wykonują zadanie, dopóki nie zostaną zatrzymane, oraz bound services, z którymi inne komponenty mogą się powiązać i komunikować. Foreground service wykonuje pracę, której użytkownik jest świadomy, i musi wyświetlać stałe powiadomienie. Ponieważ praca w tle wpływa na czas pracy baterii i wydajność, Android stopniowo wprowadzał ograniczenia dotyczące tego, kiedy aplikacje mogą uruchamiać services w tle, a w przypadku pracy, którą można odroczyć, Google zazwyczaj zaleca zamiast tego WorkManager.

Service w Androidzie to komponent aplikacji, który wykonuje pracę bez własnego interfejsu użytkownika, na przykład odtwarzanie muzyki, synchronizację lub transfer plików. Może zostać uruchomiona w celu wykonania zadania albo powiązana przez inne komponenty, które chcą się z nią komunikować. Foreground services wyświetlają stałe powiadomienie, aby użytkownik wiedział, że praca jest wykonywana, a ze względu na ograniczenia Androida dotyczące pracy w tle do zadań, które można odroczyć, często używa się WorkManagera.

More about Service

Service to jeden z czterech podstawowych komponentów aplikacji na Androida, obok activities, broadcast receivers i content providers. O ile activity wyświetla ekran, z którym użytkownik wchodzi w interakcję, o tyle service służy do pracy, która nie wymaga interfejsu użytkownika lub musi być kontynuowana nawet wtedy, gdy użytkownik opuści ekran. Typowe przykłady to odtwarzanie muzyki lub podcastów, nawigacja, przesyłanie plików i synchronizacja danych z serwerem.

Od strony technicznej service jest klasą dziedziczącą po android.app.Service i jest rejestrowana elementem service w pliku AndroidManifest.xml. System kontroluje cykl życia service za pomocą metod takich jak onCreate(), onStartCommand(), onBind() i onDestroy(). Ważne jest, aby wiedzieć, że service nie działa automatycznie w osobnym wątku. Domyślnie jej kod jest wykonywany w głównym wątku aplikacji, więc długotrwałą lub blokującą pracę trzeba przenieść do wątku w tle, na przykład za pomocą Kotlin coroutines, aby aplikacja nie przestała odpowiadać.

Services można używać na różne sposoby, z których każdy odpowiada innym potrzebom:

  1. Foreground service: Wykonuje pracę, której użytkownik jest świadomy, na przykład odtwarzanie muzyki lub aktywne śledzenie treningu. Foreground service musi wyświetlać stałe powiadomienie, a w nowszych wersjach Androida aplikacja musi zadeklarować typ service i posiadać powiązane uprawnienia.

  2. Background service: Wykonuje pracę, której użytkownik nie widzi bezpośrednio. Od Androida 8.0 obowiązują ścisłe ograniczenia dotyczące tego, kiedy aplikacje mogą uruchamiać takie services, gdy same działają w tle.

  3. Bound service: Oferuje interfejs klient-serwer, w którym inne komponenty, także z innych aplikacji, mogą powiązać się z service, wysyłać żądania i otrzymywać odpowiedzi. Bound service działa tak długo, jak długo powiązany jest z nią co najmniej jeden komponent.

Jedną z największych zalet services jest to, że pozwalają aplikacji kontynuować ważną pracę bez wiązania jej z konkretnym ekranem. Jednocześnie wymagają ostrożności, ponieważ praca w tle zużywa baterię, pamięć i dane. Dlatego Android stopniowo wprowadzał zasady ograniczające pracę w tle, a użytkownicy mogą zobaczyć i zatrzymać aplikacje, w których działają foreground services.

W przypadku wielu zadań Google zaleca zamiast tego WorkManager, który jest częścią Android Jetpack. WorkManager jest przeznaczony do pracy, która musi zostać niezawodnie wykonana, nawet jeśli aplikacja zostanie zamknięta lub urządzenie uruchomione ponownie, i którą można odroczyć, na przykład przesyłania plików logów lub okresowej synchronizacji. WorkManager uwzględnia ograniczenia systemu i można go skonfigurować z warunkami takimi jak połączenie sieciowe czy ładowanie.

Podsumowując, service to właściwy wybór, gdy aplikacja musi wykonywać trwającą pracę, której kontynuacji oczekuje użytkownik, lub gdy inne komponenty muszą komunikować się z długotrwałym procesem. Wybierając właściwy typ service albo WorkManager, gdy pracę można odroczyć, deweloperzy mogą tworzyć aplikacje, które są zarówno funkcjonalne, jak i oszczędne dla zasobów urządzenia.

Frequently asked questions about Service

Czym jest service w Androidzie?

Service to komponent Androida, który wykonuje pracę w tle bez własnego interfejsu użytkownika. Służy do zadań, które muszą być kontynuowane nawet wtedy, gdy użytkownik nie patrzy na aplikację, na przykład odtwarzania muzyki, trwającej nawigacji czy przesyłania plików.

Service musi zostać zadeklarowana w pliku AndroidManifest.xml. Ważne jest, aby wiedzieć, że domyślnie service działa w głównym wątku aplikacji. Ciężkie zadania trzeba więc i tak przenieść do wątku w tle lub coroutine. W nowszych wersjach Androida obowiązują też ścisłe zasady dotyczące tego, kiedy aplikacje mogą działać w tle, aby oszczędzać baterię.

Jakie typy services istnieją w Androidzie?

Android rozróżnia trzy typy services. Foreground service wykonuje zadanie, którego użytkownik jest świadomy, i musi wyświetlać powiadomienie przez cały czas działania. Używa się jej na przykład do odtwarzania muzyki lub śledzenia biegu.

Background service wykonuje pracę, której użytkownik nie widzi bezpośrednio. Od Androida 8.0 obowiązują ścisłe ograniczenia dotyczące tego, kiedy aplikacje mogą uruchamiać takie services, a do wielu zadań zaleca się zamiast tego WorkManager. Bound service pozwala innym komponentom, takim jak activity, powiązać się z nią i komunikować, a działa tylko tak długo, jak długo coś jest z nią powiązane.

Jaka jest różnica między started service a bound service?

Started service jest uruchamiana za pomocą startService lub startForegroundService i działa, dopóki sama się nie zatrzyma lub nie zostanie zatrzymana. Zazwyczaj wykonuje konkretne zadanie i nie zwraca wyniku bezpośrednio do komponentu, który ją uruchomił.

Bound service jest uruchamiana, gdy inny komponent powiąże się z nią za pomocą bindService. Udostępnia interfejs, dzięki któremu komponent może wywoływać metody i otrzymywać odpowiedzi, na przykład activity sterująca odtwarzaczem muzyki. Gdy nie są z nią już powiązane żadne komponenty, zostaje zatrzymana. Service może też być jednym i drugim jednocześnie, jeśli jest zarówno uruchomiona, jak i powiązana.

Kiedy należy używać WorkManagera zamiast service?

WorkManager to zalecane przez Google rozwiązanie do pracy w tle, która musi zostać niezawodnie wykonana, nawet jeśli aplikacja zostanie zamknięta lub urządzenie uruchomione ponownie. Może to być synchronizacja danych, przesyłanie plików logów lub okresowe porządkowanie.

WorkManager respektuje zasady systemu dotyczące baterii i aktywności w tle i można go ustawić tak, aby działał tylko wtedy, gdy na przykład urządzenie jest połączone z Wi-Fi lub się ładuje. Service, zwłaszcza foreground service, jest bardziej odpowiednia, gdy praca musi nastąpić natychmiast i jest widoczna dla użytkownika, na przykład przy odtwarzaniu muzyki lub trwającym połączeniu. W przypadku krótkotrwałej pracy, gdy aplikacja jest otwarta, często wystarczą coroutines.

Dlaczego foreground service musi wyświetlać powiadomienie?

Foreground service może działać przez długi czas i zużywać zasoby, takie jak procesor, bateria i dane o lokalizacji, gdy użytkownik nie ma otwartej aplikacji. Dlatego Android wymaga, aby wyświetlała stałe powiadomienie, dzięki któremu użytkownik wie, że aplikacja pracuje w tle.

Zapewnia to przejrzystość i pozwala użytkownikowi zatrzymać service lub otworzyć aplikację. W nowszych wersjach Androida deweloperzy muszą też zadeklarować typ service, na przykład odtwarzanie multimediów, lokalizację lub synchronizację danych, i posiadać powiązane uprawnienia. Od Androida 13 użytkownik musi także udzielić zgody na powiadomienia, co wpływa na sposób wyświetlania powiadomienia.

Jakie ograniczenia Android nakłada na pracę w tle?

Aby oszczędzać baterię i chronić prywatność użytkownika, Android stopniowo wprowadzał ograniczenia dotyczące pracy w tle. Od Androida 8.0 aplikacje działające w tle co do zasady nie mogą uruchamiać zwykłych background services, a system zatrzymuje je po krótkim czasie.

Tryb Doze i App Standby odraczają dostęp do sieci i zadania, gdy urządzenie nie jest używane lub aplikacja jest rzadko używana. Nowsze wersje wymagają typów i uprawnień dla foreground services oraz ograniczają, kiedy mogą być uruchamiane z tła. Dostęp do lokalizacji w tle wymaga osobnego uprawnienia. Pracę w tle należy więc w miarę możliwości planować za pomocą WorkManagera.

Service for dummies

Service w aplikacji na Androida to rodzaj niewidzialnego pomocnika, który może dalej pracować, nawet gdy nikt nie patrzy na aplikację. Weźmy aplikację muzyczną: można włączyć utwór, wrócić do ekranu głównego i napisać wiadomość, a muzyka nadal gra. Zajmuje się tym właśnie service. Gdy aplikacja używa service do czegoś, o czym użytkownik powinien wiedzieć, telefon wyświetla małe powiadomienie, więc jasne jest, że aplikacja pracuje. Jednocześnie Android dba o to, aby aplikacje nie zużywały w tle zbyt dużo energii, dzięki czemu bateria starcza na dłużej.

Dodaj komentarz