Serwis a IntentService

Czy ktoś może mi pokazać przykład czegoś, co można zrobić za pomocą IntentService, czego nie można zrobić za pomocą Service (i vice-versa)?

Wierzę również, że IntentService działa w innym wątku, a Service nie. Tak więc, z tego co widzę, uruchamianie usługi we własnym wątku jest jak uruchamianie IntentService. Prawda?

Byłbym wdzięczny, gdyby ktoś mógł mi pomóc w obu moich pytaniach.
Author: Jared Rummler, 2013-03-20

12 answers

Tejas Lagvankar napisał fajny post na ten temat. Poniżej znajdują się kluczowe różnice między usługą a IntentService.

Kiedy używać?

  • Usługa Może być używana w zadaniach bez interfejsu użytkownika, ale nie powinna być zbyt długa. Jeśli musisz wykonywać długie zadania, musisz użyć wątków w usłudze.

  • IntentService może być używany w długich zadaniach, zwykle bez komunikacji z głównym wątkiem. Jeśli komunikacja jest wymagane, można użyć głównego wątku obsługi lub intencji broadcast. Innym przypadkiem użycia jest, gdy potrzebne są wywołania zwrotne (zadania wyzwalane intencją).

Jak uruchomić?

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

  • IntentService jest uruchamiany za pomocą Intent, rodzi nowy wątek roboczy i Metoda onHandleIntent() jest wywoływana w tym wątku.

Wyzwalane Od

  • usługa i IntentService może zostać uruchomiona z dowolnego wątku, aktywności lub innego komponentu aplikacji.

Działa Na

  • Usługa Działa w tle, ale działa w głównym wątku aplikacji.

  • Program IntentService Działa na osobnym wątku roboczym.

Ograniczenia / Wady

  • Na serwis może zablokować główny wątek aplikacji.

  • IntentService nie może uruchamiać zadań równolegle. W związku z tym wszystkie kolejne intencje trafią do kolejki komunikatów dla wątku roboczego i będą wykonywane kolejno.

Kiedy przestać?

  • Jeśli zaimplementujesz usługę , Twoim obowiązkiem jest zatrzymanie usługi po zakończeniu jej pracy, dzwoniąc stopSelf() lub stopService(). (Jeśli tylko chcesz zapewnij Wiązanie, nie musisz implementować tej metody).

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

 1197
Author: José Juan Sánchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 09:31:15

Jeśli ktoś może mi pokazać przykład czegoś, co można zrobić z intentService i nie można zrobić z usługą i na odwrót.

Z definicji jest to niemożliwe. IntentService jest podklasą Service, napisaną w kodzie Java. Dlatego wszystko, co robi IntentService, może zrobić Service, włączając odpowiednie bity kodu, których używa IntentService.

Uruchamianie usługi z własnym wątkiem jest jak uruchamianie usługi IntentService. Czy to nie?

Trzy podstawowe cechy IntentService to:

  • Wątek tła

  • Automatyczne kolejkowanie Intent s dostarczone do onStartCommand(), więc jeśli jedno Intent jest przetwarzane przez onHandleIntent() w wątku tła, inne polecenia ustawiają się w kolejce oczekując swojej kolei

  • Automatyczne wyłączanie IntentService, poprzez wywołanie stopSelf(), gdy kolejka jest pusta

Każdy z nich może być zaimplementowany przez Service bez rozszerzenie IntentService.

 137
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 22:18:19

Serwis

  • wywołanie przez startService()
  • wyzwalane z dowolnego Thread
  • Działa na Main Thread
  • Może zablokować główny wątek (UI). Zawsze używaj wątku w usłudze do długich zadań
  • Po wykonaniu zadania, naszym obowiązkiem jest zaprzestanie obsługi przez telefon stopSelf() lub stopService()

IntentService

  • wykonuje długie zadanie zwykle bez komunikacji z głównym wątkiem jeśli komunikacja jest potrzebna to jest to wykonywane przez Handler lub BroadcastReceiver
  • wywołanie przez Intent
  • wywołane z Main Thread
  • Działa na osobnym wątku
  • nie można uruchomić zadania równolegle i wiele intencji jest w kolejce w tym samym wątku roboczym.
 28
Author: Umang Kothari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 10:54:37

Różnice

    Klasa Service używa wątku aplikacji main, podczas gdy IntentService tworzy wątek worker i używa tego wątku do uruchomienia usługi.
  1. IntentService tworzy kolejkę, która przekazuje jedną intencję na raz do onHandleIntent(). Dlatego implementacja wielowątkowa powinna być dokonana poprzez bezpośrednie rozszerzenie klasy usług.
  2. Klasa serwisowa wymaga ręcznego zatrzymania przy użyciu stopSelf(). Tymczasem IntentService automatycznie zatrzymuje się, gdy nie ma intencji w kolejce, / align = "left" /
  3. IntentService implementuje onBind(), które zwraca null. Oznacza to, że usługa IntentService nie może być domyślnie związana.
  4. IntentService implementuje onStartCommand(), która wysyła Intent do queue i do onhandleintent ().
 21
Author: varun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 11:28:08

Dodawanie punktów do zaakceptowanej odpowiedzi:

Zobacz użycie IntentService w Android API. eg:

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

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

Aby utworzyć komponent IntentService dla Twojej aplikacji, zdefiniuj klasę rozszerzającą IntentService, a w jej ramach zdefiniuj metodę nadpisującą 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;
    }

Usługa razem AsyncTask jest jednym z najlepszych podejść do wiele przypadki użycia, w których ładunek nie jest ogromny. lub po prostu utworzyć klasę / align = "left" / Od wersji Androida 4.0 cała sieć operacje powinny być wykonywane w tle, w przeciwnym razie kompilacja/Kompilacja aplikacji nie powiedzie się. oddziel 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 informacji na ten temat można znaleźć w wpisie na blogu

From Android developers guide:

IntentService jest klasa bazowa dla usług obsługujących żądania asynchroniczne (wyrażone jako intencje) na żądanie. Klienci wysyłają żądania poprzez wywołania 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 skończy się praca.

Wzorzec projektowy stosowany w IntentService

: Ten" procesor kolejki pracy " jest powszechnie używany do odciążania zadań z głównego wątku aplikacji. Klasa IntentService istnieje do uprość ten wzór i zadbaj o mechanikę. Aby z niego korzystać, rozszerz IntentService i zaimplementuj onHandleIntent (Intent). IntentService otrzyma Intenty, uruchomi wątek roboczy i odpowiednio zatrzyma usługę.

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

Klasa IntentService zapewnia prostą strukturę do wykonywania operacji na jednym wątku tła. Umożliwia to działowi it obsługę długotrwałych operacji bez wpływu na szybkość reakcji interfejsu użytkownika. Ponadto większość zdarzeń cyklu życia interfejsu użytkownika nie ma wpływu na usługę IntentService, więc nadal działa w okolicznościach, które wyłączyłyby funkcję AsyncTask.

IntentService ma kilka ograniczeń:

Nie może wchodzić w interakcję bezpośrednio z interfejsem użytkownika. Aby umieścić jego wyniki w interfejsie użytkownika, musisz wysłać je do Aktywność. Żądania pracy przebiegają kolejno. Jeśli operacja jest uruchomiona w usłudze IntentService i wyślesz jej kolejne żądanie, żądanie to czeka aż pierwsza operacja zostanie zakończona. Operacja uruchomiona na IntentService nie może zostać przerwana. Jednak w większości przypadków

IntentService jest preferowanym sposobem na proste operacje w tle.]}

**

Volley Library

Istnieje Biblioteka o nazwie volley-biblioteka do tworzenia Androida aplikacje sieciowe Kod źródłowy jest dostępny publicznie w serwisie GitHub.

[2]}oficjalna dokumentacja Androida dla najlepszych praktyk dla zadań w tle : pomaga lepiej zrozumieć intent service, thread, handler, service. a także wykonywanie operacji sieciowych
 11
Author: Sree Rama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 07:32:06

Jestem pewien, że możesz znaleźć obszerną listę różnic po prostu googlują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 obrazów na początku otwierania aplikacji. Jest to jednorazowy proces i może się oczyścić po pobraniu wszystkiego.

Usługa: usługa, która będzie stale używana do komunikacji między Twoją aplikacją a zapleczem za pomocą wywołań web API. Nawet jeśli jest gotowy do bieżącego zadania, nadal chcesz, aby było około kilka minut później, aby uzyskać więcej komunikacji.

 10
Author: Stefan de Bruijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 13:14:06

IntentService

IntentService działa na własnym wątku. Zatrzyma się, gdy to się skończy. Bardziej jak ogień i zapomnienie. Kolejne połączenia będą w kolejce. Dobre do kolejkowania połączeń. Możesz również obracać wiele wątków w IntentService, jeśli zajdzie taka potrzeba - możesz to osiągnąć za pomocą ThreadPoolExecutor. Mówię to, ponieważ wiele osób zapytało mnie "po co używać IntentService, ponieważ nie obsługuje równoległego wykonywania". IntentService to tylko wątek. Możesz zrobić wszystko, czego potrzebujesz w środku-nawet obracając wiele nici. Jedyne zastrzeżenie czy to, że IntentService kończy się, gdy tylko kręcisz te wiele wątków. Nie czeka na powrót tych wątków. Musisz się tym zająć. Dlatego zalecam użycie ThreadPoolExecutor w tych scenariuszach.

  • dobry do synchronizacji, wgrywania itp ...

Serwis

Domyślnie Service działa na głównym wątku. Musisz kręcić wątek roboczy, aby wykonać swoją pracę. Musisz przestać service wyraźnie. Użyłem go do sytuacji, gdy trzeba uruchomić rzeczy w tle, nawet gdy odsuń się od aplikacji i wróć więcej po Bezgłowy service.

  • W razie potrzeby możesz uruchomić wiele wątków.
  • może być używany w aplikacjach takich jak odtwarzacze muzyki.

W razie potrzeby zawsze możesz wrócić do swojej aktywności za pomocą BroadcastReceivers.

 9
Author: Sayooj Valsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 10:14:43

IntentService to rozszerzenie usługi, które ma na celu ułatwienie wykonania zadania, które musi być wykonane w tle i w oddzielnym wątku.

IntentService uruchamia, tworzy wątek i uruchamia jego zadanie w wątku. po zrobieniu wszystko czyści. Tylko jedna instancja IntentService może działać w tym samym czasie, kilka wywołań jest wywoływanych.

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

Na przykład usługa połączona z serwerem xmpp i związana działaniami nie może być po prostu wykonana za pomocą usługi IntentService. Skończysz ignorując lub nadpisując IntentService rzeczy.

 8
Author: njzk2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 13:20:30

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

IntentService nie może być używany przez długi czas słuchania, jak w przypadku słuchaczy XMPP, jest to pojedynczy operator czasu, wykonaj pracę i pożegnaj się z falą.

Ma również tylko jeden threadworker, ale za pomocą sztuczki można go używać jako nieograniczonego.

 5
Author: user3764748,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 11:15:39

Nie odkrywaj koła na nowo

IntentService rozszerza klasę Service , co wyraźnie oznacza, że IntentService jest celowo stworzona dla tego samego celu.

Więc jaki jest cel ?

IntentService ma na celu ułatwienie nam wykonywania zadań w tle, nawet nie martwiąc się o to]}
  • Tworzenie wątku roboczego

  • Kolejkowanie przetwarzania wielokrotnego-żądanie jeden po drugim (Threading)

  • zniszczenie Service

Więc nie, Service może wykonać każde zadanie, które zrobiłby IntentService. Jeśli twoje wymagania mieszczą się w wyżej wymienionych kryteriach, nie musisz zapisywać tych Logik w klasie Service. Więc nie odkrywaj koła na nowo, ponieważ {[0] } jest wymyślonym Kołem.

"główna" różnica

Usługa działa na wątku UI, podczas gdy IntentService działa na oddzielny wątek

Jak powstaje IntentService od Service

Normalna usługa działa na wątku UI(dowolny typ komponentu Android działa domyślnie na wątku UI, np. Activity, BroadcastReceiver, ContentProvider i Service). Jeśli musisz wykonać jakąś pracę, która może zająć trochę czasu, musisz utworzyć wątek. W przypadku wielu żądań, będziesz musiał zająć się synchronization. IntentService podano domyślną implementację, która wykonuje te zadania za Ciebie.
Według strony dewelopera

  1. IntentService tworzy pracownika Wątek

  2. IntentService tworzy kolejkę roboczą, która wysyła żądanie do metody onHandleIntent() jeden po drugim

  3. gdy nie ma pracy to IntentService wywołuje stopSelf() metodę
  4. zapewnia domyślną implementację metody onBind(), która jest null
  5. Domyślna implementacja dla onStartCommand(), która wysyła Intent żądanie do WorkQueue i ostatecznie do onHandleIntent()
 5
Author: Rohit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 11:58:02

Główna różnica:

  1. Service class needs a manual stop using stopSelf(). W międzyczasie IntentService Automatycznie zatrzymuje się, gdy w kolejce nie ma intencji.

  2. IntentServic e może być używany zazwyczaj w długich zadaniach, ale jeśli musisz wykonywać długie zadania, musisz użyć wątków w Service.

 4
Author: Arpana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 10:57:00

Zasadnicza różnica pomiędzy a Service a an IntentService jest opisana następująco:

Usługa:

1.A Service domyślnie działa w głównym wątku aplikacji.(tutaj nie ma domyślnego wątku roboczego).więc użytkownik musi utworzyć osobny wątek i wykonać w nim wymaganą pracę.

2.Pozwala na wiele żądań jednocześnie.(Wielowątkowość)

IntentService:

1.Teraz, przechodząc do IntentService, tutaj domyślny wątek roboczy jest dostępny dla wykonaj dowolną operację. zauważ, że - musisz zaimplementować metodę onHandleIntent(), która otrzymuje intencję dla każdego żądania startowego, gdzie możesz wykonać pracę w tle.

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

 3
Author: Narendrakumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 10:57:44