Usługa a usługa IntentService na platformie Android

774

Szukam przykładu czegoś, co można zrobić za pomocą czegoś, czego IntentServicenie można zrobić za pomocą Service(i odwrotnie)?

Uważam również, że IntentServicebiegnie w innym wątku, a Servicenie. Tak więc, o ile widzę, uruchomienie usługi we własnym wątku jest jak uruchomienie IntentService. Czy to jest poprawne?

Roiberg
źródło
45
IntentService is used for short tasks (etc) and a service is for long onesgdzie to przeczytałeś?
njzk2
9
a także proponuję przeczytać kod źródłowy dla IntentService. Wyjaśnia to, co to jest i co robi.
njzk2
1
Zredagowałem moje pytanie po tym, jak zobaczyłem twój komentarz.
roiberg
2
Link w poprzednim komentarzu (autor: greg7gkb) to świetna lektura.
DSlomer64

Odpowiedzi:

1348

Tejas Lagvankar napisał fajny post na ten temat. Poniżej kilka kluczowych różnic między usługą a usługą IntentService.

Kiedy użyć?

  • Usługi mogą być wykorzystywane w zadaniach bez interfejsu użytkownika, ale nie powinien być zbyt długi. Jeśli musisz wykonywać długie zadania, musisz używać wątków w ramach usługi.

  • Usługa IntentService może być używana w długich zadaniach, zwykle bez komunikacji z głównym wątkiem . Jeśli wymagana jest komunikacja, można użyć modułu obsługi wątku głównego lub transmisji intencji. Innym przypadkiem użycia są sytuacje, w których potrzebne są połączenia zwrotne (zamierzone zadania uruchamiane).

Jak uruchomić?

  • Usługa jest wyzwalany przez wywołanie metody startService().

  • Usługa IntentService jest uruchamiana za pomocą funkcji Intent, spawnuje nowy wątek roboczy i metoda onHandleIntent()jest wywoływana w tym wątku.

Uruchomiony z

  • Obsługa i IntentService może być wyzwalany z dowolnego wątku, działalności lub innego składnika aplikacji.

Działa na

  • Usługa działa w tle, ale to działa na wątku głównego aplikacji.

  • Usługa IntentService działa w osobnym wątku roboczym .

Ograniczenia / wady

  • Usługa może zablokować wątek główny aplikacji.

  • Usługa IntentService nie może uruchamiać zadań równolegle. Dlatego wszystkie kolejne zamiary przejdą do kolejki komunikatów dla wątku roboczego i będą wykonywane sekwencyjnie.

Kiedy przestać?

  • Jeśli wdrożysz Usługę , Twoim obowiązkiem jest zatrzymać usługę po zakończeniu pracy, dzwoniąc stopSelf()lub stopService(). (Jeśli chcesz tylko zapewnić powiązanie, nie musisz implementować tej metody).

  • Usługa IntentService zatrzymuje usługę po przetworzeniu wszystkich żądań uruchomienia, więc nigdy nie musisz dzwonić stopSelf().

José Juan Sánchez
źródło
11
krótkie i słodkie, ale lepiej jest, jeśli edytujesz swoją odpowiedź, w tym punkty przez CommonsWare, ponieważ wiele osób czyta tylko odpowiedzi zaakceptowane lub najbardziej uprzywilejowane
Shirish Herwade
12
@Darpan Usługa to komponent aplikacji, który może wykonywać długotrwałe operacje w tle i nie zapewnia interfejsu użytkownika. Usługa działa w głównym wątku procesu hostingowego. Usługa nie tworzy własnego wątku i nie działa w osobnym procesie (chyba że określono inaczej). Oznacza to, że jeśli twoja usługa będzie wykonywać operacje intensywnie wykorzystujące procesor lub operacje blokujące (takie jak odtwarzanie MP3 lub praca w sieci), powinieneś utworzyć nowy wątek w ramach usługi, aby wykonać tę pracę.
José Juan Sánchez
8
„Usługa IntentService musi zostać uruchomiona z głównego wątku.” Jesteś pewny? Wewnątrz mojej MainActivity onCreate (), gdy wywołuję IntentService z nowego wątku (kod poniżej), to nadal działa dla mnie. nowy wątek (new Runnable () {@Override public void run () {Intent intent = new Intent (kontekst, HelloIntentService.class); startService (intent);}}). start ();
Ashok Bijoy Debnath,
9
@AshokBijoyDebnath Masz rację! Te usługi i IntentServices można uruchomić z dowolnego wątku, działalności lub innego składnika aplikacji. Właśnie zmodyfikowałem tekst odpowiedzi, aby rozwiązać ten problem. Dziękujemy za sugestię edycji! :)
José Juan Sánchez
2
Nie ma problemu, idź!
José Juan Sánchez
165

Jeśli ktoś może mi pokazać przykład czegoś, co można zrobić za pomocą IntentServicei czego nie można zrobić za pomocą Servicei odwrotnie.

Z definicji jest to niemożliwe. IntentServicejest podklasą Servicenapisaną w Javie. Stąd wszystko, co IntentServicerobi, Servicemoże zrobić, włączając odpowiednie fragmenty kodu, który IntentServiceużywa.

Uruchomienie usługi z własnym wątkiem jest jak uruchomienie usługi IntentService. Czyż nie

Trzy podstawowe cechy IntentServiceto:

  • wątek tła

  • automatyczne kolejkowanie Intents dostarczane do onStartCommand(), więc jeśli jeden Intentjest przetwarzany przez onHandleIntent()wątek w tle, inne polecenia ustawiają się w kolejce, czekając na swoją kolej

  • automatyczne zamykanie IntentService, poprzez połączenie z stopSelf(), gdy kolejka jest pusta

Wszystko to można wdrożyć Servicebez przedłużania IntentService.

CommonsWare
źródło
6
Trochę późno, ale okazuje się, że Servicesprawdzone z startServicemoże działać tylko przez około 10 sekund przed rzuceniem ANR - IntentServicerozpoczęcie nadawania zamiaru nie wydaje się mieć tego ograniczenia
edtththth
16
@edthethird: To dlatego, że wiązałeś główny wątek aplikacji. Wszystkie metody cyklu życia wszystkich komponentów, w tym onStartCommand()a Service, są wywoływane w głównym wątku aplikacji. Nie możesz powiązać tego wątku dłużej niż kilka milisekund bez zamrażania interfejsu użytkownika, a jeśli zajmie to wiele sekund, otrzymasz równoważnik usługi ANR.
CommonsWare 18.11.13
3
tak, skomentowałem zbyt wcześnie. Pracowałem onStartCommandzamiast onHandleIntent- wygląda na onStartCommandto, że jest uruchamiany w wątku interfejsu użytkownika, jednak do onHandleIntentwykonania jest spawnowany osobny wątek .
edtthth
3
@IgorGanapolsky: IntentServicesam to nazywa, po onHandleIntent()powrocie, jeśli nie ma już pracy do wykonania.
CommonsWare
1
Problemem nie jest angielski, ale programowanie. Na przykład „zamknąłem aplikację” nie ma dokładnej definicji, więc nie mogę powiedzieć, co się stanie, kiedy to nastąpi. Nie wiem też, w jaki sposób „zamknąłem aplikację” dotyczy „zostanie pobrana po 1 godzinie”. Możesz rozważyć zadanie osobnego pytania o przepełnienie stosu, w którym możesz podać minimalny, powtarzalny przykład „pobierzesz po 1 godzinie”. Tam możesz szczegółowo wyjaśnić, co oznacza „zamknąłem aplikację” (na przykład, co konkretnie robi użytkownik, aby zamknąć aplikację?).
CommonsWare
39

Usługa

  • Wywołaj przez startService()
  • Wyzwolony z dowolnego Thread
  • Działa dalej Main Thread
  • Może blokować główny wątek (UI). Zawsze używaj wątku w ramach usługi do długiego zadania
  • Po wykonaniu zadania naszym obowiązkiem jest zatrzymać usługę, dzwoniąc stopSelf()lubstopService()

IntentService

  • Wykonuje długie zadanie, zwykle nie ma komunikacji z głównym wątkiem, jeśli komunikacja jest potrzebna, wówczas odbywa się to za pomocą HandlerlubBroadcastReceiver
  • Wywołaj przez Intent
  • Uruchomiono z Main Thread
  • Działa w osobnym wątku
  • Nie można uruchomić zadania równolegle, a wiele zamiarów jest umieszczonych w kolejce w tym samym wątku roboczym.
Umang Kothari
źródło
19

Nie wymyślaj koła ponownie

IntentService rozszerza klasę usług, co wyraźnie oznacza, że IntentServicejest celowo wykonany w tym samym celu.

Więc jaki jest cel?

`Celem IntentService jest ułatwienie nam wykonywania zadań w tle, nawet bez obaw

  • Tworzenie wątku roboczego

  • Kolejkowanie przetwarzania wielu żądań jeden po drugim ( Threading)

  • Niszczenie Service

Więc NIE , Servicemoże wykonać każde zadanie, które IntentServiceby wykonał. Jeśli twoje wymagania mieszczą się w wyżej wymienionych kryteriach, nie musisz pisać logiki w Serviceklasie. Więc nie IntentServicewymyślaj ponownie koła, ponieważ jest to koło wymyślone.

Podstawowa różnica

Usługa działa w wątku interfejsu użytkownika, podczas gdy usługa IntentService działa w osobnym wątku

Kiedy korzystasz z usługi IntentService?

Jeśli chcesz wykonać wiele zadań w tle, jedno po drugim, które istnieją poza zakresem działania, wówczas IntentServicejest to idealne rozwiązanie.

Jak IntentServicejest zrobionyService

Normalnego uruchomienia usługi na UI wątek (dowolnego typu biegnie Android komponentowego wątku UI domyślnie np Activity, BroadcastReceiver, ContentProvideri Service). Jeśli musisz wykonać pracę, która może chwilę potrwać, musisz utworzyć wątek. W przypadku wielu próśb będziesz musiał sobie poradzić synchronization. IntentServiceotrzymuje domyślną implementację, która wykonuje te zadania za Ciebie.
Według strony programisty

  1. IntentService tworzy wątek roboczy

  2. IntentServicetworzy kolejkę roboczą, która wysyła żądanie do onHandleIntent()metody jedna po drugiej

  3. Gdy nie ma pracy, IntentServicewywołuje stopSelf()metodę
  4. Zapewnia domyślną implementację onBind()metody o wartości NULL
  5. Domyślna implementacja, dla onStartCommand()której wysyła Intentżądanie do WorkQueue i ostatecznie doonHandleIntent()
Rohit Singh
źródło
15

Dodanie punktów do zaakceptowanej odpowiedzi:

Zobacz użycie IntentService w interfejsie API Androida. na przykład:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

Aby utworzyć komponent IntentService dla swojej aplikacji, zdefiniuj klasę rozszerzającą IntentService, aw jej ramach zdefiniuj metodę, która zastąpi metodę OnHandleIntent ().

Zobacz także kod źródłowy IntentService, jego konstruktor i metody cyklu życia, takie jak onStartCommand ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

Wspólna obsługa AsyncTask jest jednym z najlepszych podejść w wielu przypadkach użycia, w których ładowność nie jest duża. lub po prostu utwórz klasę rozszerzającą IntentSerivce. Od wersji Androida 4.0 wszystkie operacje sieciowe powinny odbywać się w tle, w przeciwnym razie kompilacja / kompilacja aplikacji nie powiedzie się. oddzielić wątek od interfejsu użytkownika. Klasa AsyncTask zapewnia jeden z najprostszych sposobów odpalenia nowego zadania z wątku interfejsu użytkownika. Więcej dyskusji na ten temat można znaleźć w poście na blogu

z przewodnika dla programistów Androida :

IntentService to klasa bazowa dla usług, które obsługują żądania asynchroniczne (wyrażone jako intencje) na żądanie. Klienci wysyłają żądania za pośrednictwem połączeń startService (intent); usługa jest uruchamiana w razie potrzeby, obsługuje każdą intencję z kolei za pomocą wątku roboczego i zatrzymuje się, gdy kończy się praca.

Wzorzec projektowy używany w usłudze IntentService

: Ten wzorzec „procesora kolejek roboczych” jest powszechnie używany do odciążania zadań z głównego wątku aplikacji. Klasa IntentService istnieje, aby uprościć ten wzór i zająć się mechaniką. Aby z niego skorzystać, rozszerz IntentService i zaimplementuj onHandleIntent (Intent). Usługa IntentService otrzyma intencje, uruchomi wątek roboczy i odpowiednio zatrzyma usługę.

Wszystkie żądania są obsługiwane w jednym wątku roboczym - mogą zająć tak długo, jak to konieczne (i nie zablokuje głównej pętli aplikacji), ale tylko jedno żądanie będzie przetwarzane jednocześnie.

Klasa IntentService zapewnia prostą strukturę do uruchamiania operacji na pojedynczym wątku w tle. Pozwala to na obsługę długotrwałych operacji bez wpływu na szybkość reakcji interfejsu użytkownika. Ponadto na IntentService nie ma wpływu większość zdarzeń w cyklu życia interfejsu użytkownika, więc nadal działa w okolicznościach, które zamknęłyby AsyncTask.

Usługa IntentService ma kilka ograniczeń:

Nie może oddziaływać bezpośrednio z interfejsem użytkownika. Aby umieścić wyniki w interfejsie użytkownika, musisz wysłać je do działania. Zlecenia pracy są uruchamiane sekwencyjnie. Jeśli operacja jest uruchomiona w usłudze IntentService, a wyślesz jej kolejne żądanie, żądanie czeka na zakończenie pierwszej operacji. Operacja uruchomiona na usłudze IntentService nie może zostać przerwana. Jednak w większości przypadków

IntentService to preferowany sposób na proste operacje w tle

**

Biblioteka Volley

Istnieje biblioteka o nazwie volley-library do tworzenia aplikacji sieciowych dla Androida . Kod źródłowy jest dostępny publicznie w GitHub.

Oficjalna dokumentacja Androida dotycząca najlepszych praktyk dla zadań w tle : pomaga lepiej zrozumieć celowe usługi, wątki, procedury obsługi, usługi. a także wykonywanie operacji sieciowych

Sree Rama
źródło
1
Mogłoby być lepiej, gdybyś mógł udzielić krótkiej, właściwej odpowiedzi.
eRaisedToX
12

Jestem pewien, że możesz znaleźć obszerną listę różnic, po prostu przeglądając coś takiego, jak „Android IntentService vs. Service”

Jedną z ważniejszych różnic na przykład jest to, że IntentService kończy się po zakończeniu.

Niektóre przykłady (szybko wymyślone) mogą być;

IntentService: Jeśli chcesz pobrać kilka zdjęć na początku otwierania aplikacji. Jest to proces jednorazowy i można go wyczyścić po pobraniu wszystkiego.

Usługa: usługa, która będzie stale używana do komunikacji między aplikacją a zapleczem za pomocą wywołań interfejsu API sieci Web. Nawet jeśli zakończy się to z bieżącym zadaniem, nadal chcesz, aby pojawił się kilka minut później, aby uzyskać lepszą komunikację.

Stefan de Bruijn
źródło
2
Nie znalazłem jednego przykładu, który można zrobić z jednym, a nie z drugim. tylko kilka wyjaśnień, które mi nie pomogły.
roiberg
1
Wypróbuj tę stronę, ma wiele dobrych wyjaśnień na temat podstawowych koncepcji Androida z przyzwoitymi przykładami vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn
4
To kolejny przykład „jak korzystać”. nie, gdy konkretnie korzystasz z usługi i kiedy masz zamiar. Podaj mi teoretyczny przykład, a nie linki do „jak korzystać” lub innych upodobań dla tego miernika. Nie proszę was, abyście „pracowali” dla mnie, a ja nic nie robię, to tylko to, że widziałem już wszystkie te upodobania i nadal nie jestem pewien.
roiberg
5
to dość ważna różnica. na przykład, jeśli używasz usługi do utrzymywania stałego połączenia z serwerem, nie możesz do tego użyć intentservice, ponieważ jest ona zakończona zaraz po zakończeniu wszystkich swoich zadań
pelotasplus
24
kiedy google to, prowadzi mnie tutaj. teraz jestem w nieskończonej pętli.
Lou Morda
12

IntentService

IntentServicedziała na własnym wątku. Gdy się skończy, zatrzyma się. Bardziej jak ogień i zapomnij. Kolejne połączenia będą w kolejce. Dobry do kolejkowania połączeń. Możesz także zakręcić wiele wątków, IntentServicejeśli potrzebujesz - Możesz to osiągnąć za pomocą ThreadPoolExecutor. Mówię to, ponieważ wiele osób pytało mnie „po co korzystać, IntentServiceponieważ nie obsługuje równoległego wykonywania”. IntentServiceto tylko wątek. Możesz zrobić w nim wszystko, czego potrzebujesz - nawet obracając wiele wątków. Jedynym zastrzeżeniem jest to, że IntentServicekończy się, gdy tylko zakręcisz wiele wątków. Nie czeka na powrót tych wątków. Musisz się tym zająć. Dlatego zalecam stosowanie ThreadPoolExecutorw tych scenariuszach.

  • Dobry do synchronizacji, przesyłania itp.

Usługa

Domyślnie Servicedziała w głównym wątku. Musisz zakręcić wątek roboczy, aby wykonać swoją pracę. Musisz się servicewyraźnie zatrzymać . Użyłem go do sytuacji, w której musisz uruchamiać rzeczy w tle, nawet gdy odsuniesz się od aplikacji i wrócisz więcej po Bezgłowy service.

  • Ponownie możesz uruchomić wiele wątków, jeśli potrzebujesz.
  • Może być używany do aplikacji takich jak odtwarzacze muzyki.

Zawsze możesz komunikować się z powrotem na temat swojej aktywności, używając w BroadcastReceiversrazie potrzeby.

Sayooj Valsan
źródło
8

Usługa IntentService jest rozszerzeniem usługi stworzonym w celu ułatwienia wykonania zadania, które musi zostać wykonane w tle i oddzielnym wątku.

Rozpocznie się usługa IntentService, utwórz wątek i uruchomi swoje zadanie w wątku. po zakończeniu wszystko czyści. Jednocześnie może działać tylko jedna instancja usługi IntentService, kilka połączeń jest umieszczanych w kolejce.

Jest bardzo prosty w użyciu i bardzo wygodny do wielu zastosowań, na przykład do pobierania rzeczy. Ma jednak ograniczenia, które mogą sprawić, że będziesz chciał skorzystać z bardziej podstawowej (nie prostej) usługi.

Na przykład usługi podłączonej do serwera xmpp i powiązanej z działaniami nie można po prostu wykonać za pomocą usługi IntentService. Skończysz ignorowanie lub nadpisywanie rzeczy IntentService.

njzk2
źródło
wydaje się, że większość ludzi, którzy chcą uruchomić naprawdę długo działającą usługę w tle, próbuje znaleźć informacje na temat usługi IntentService, ponieważ dokumenty sprawiają, że wydaje się, że jest to do zrobienia, ale możesz równie dobrze używać nowego wątku (new Runnable ()). start (). innymi słowy, kiedy mówi o „spawnowaniu nowego wątku”, to wszystko, co robi, nie przenosi go do osobnego procesu, który jest właściwie tym, co większość ludzi chce zrobić, gdy chce oddzielić jakiś działający kod od działania ! (ponieważ i tak tylko spawanie wątków jest jednym linerem)
Lassi Kinnunen
intentService dba również o cykl życia wątku i używa looper'a, który pomaga harmonogramowi. Zapewnia również, że działa tylko jedna instancja, i kolejkuje inne połączenia.
njzk2
5

Jeśli ktoś może mi pokazać przykład czegoś, co można zrobić za pomocą IntentServicei czego nie można zrobić za pomocą servicei odwrotnie.

IntentService nie może być używany do słuchania przez długi czas, tak jak w przypadku słuchaczy XMPP, jest to operator jednorazowy, wykonujący zadanie i machający na pożegnanie.

Ma również tylko jeden wątek, ale dzięki sztuczce możesz używać go jako nieograniczonego.

użytkownik3764748
źródło
4

Główna różnica między a Servicea IntentServicejest opisana następująco:

Usługa :

1.A Servicedomyślnie działa w głównym wątku aplikacji (tutaj domyślny wątek roboczy nie jest dostępny). Tak więc użytkownik musi utworzyć osobny wątek i wykonać w tym wątku wymaganą pracę.

2. Zezwala na wiele żądań jednocześnie. (Wiele wątków)

IntentService:

1. Teraz, przechodząc do IntentServicetutaj, dostępny jest domyślny wątek roboczy do wykonania dowolnej operacji. Zauważ, że - Musisz zaimplementować onHandleIntent()metodę, która odbiera zamiar dla każdego żądania uruchomienia, w której możesz wykonać pracę w tle.

2. Ale dopuszcza tylko jedno żądanie na raz.

Narendrakumar
źródło
3

Android IntentService vs Service

1. usługa

  • Usługa jest wywoływana za pomocą startService ().
  • Usługę można wywołać z dowolnego wątku.
  • Usługa domyślnie uruchamia operacje w tle w głównym wątku aplikacji. Dlatego może blokować interfejs użytkownika aplikacji.
  • Usługa wywoływana wiele razy utworzyłaby wiele instancji.
  • Usługa musi zostać zatrzymana za pomocą stopSelf () lub stopService ().
  • Usługa Android może uruchamiać operacje równoległe.

2. IntentService

  • Usługa IntentService jest wywoływana za pomocą funkcji Intent.
  • Usługa IntentService może być wywoływana tylko z głównego wątku.
  • Usługa IntentService tworzy oddzielny wątek roboczy do uruchamiania operacji w tle.
  • Wywołanie usługi IntentService wiele razy nie spowoduje utworzenia wielu instancji.
  • Usługa IntentService automatycznie zatrzymuje się po zakończeniu kolejki. Nie ma potrzeby uruchamiania stopService () lub stopSelf ().
  • W usłudze IntentService wiele zamierzonych wywołań jest automatycznie umieszczanych w kolejce i byłyby wykonywane sekwencyjnie.
  • Usługa IntentService nie może uruchomić operacji równoległej jak usługa.

Patrz tutaj

Deepak Gupta
źródło