Szukam przykładu czegoś, co można zrobić za pomocą czegoś, czego IntentService
nie można zrobić za pomocą Service
(i odwrotnie)?
Uważam również, że IntentService
biegnie w innym wątku, a Service
nie. Tak więc, o ile widzę, uruchomienie usługi we własnym wątku jest jak uruchomienie IntentService
. Czy to jest poprawne?
IntentService is used for short tasks (etc) and a service is for long ones
gdzie to przeczytałeś?Odpowiedzi:
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
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()
lubstopService()
. (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()
.źródło
Z definicji jest to niemożliwe.
IntentService
jest podklasąService
napisaną w Javie. Stąd wszystko, coIntentService
robi,Service
może zrobić, włączając odpowiednie fragmenty kodu, któryIntentService
używa.Trzy podstawowe cechy
IntentService
to:wątek tła
automatyczne kolejkowanie
Intent
s dostarczane doonStartCommand()
, więc jeśli jedenIntent
jest przetwarzany przezonHandleIntent()
wątek w tle, inne polecenia ustawiają się w kolejce, czekając na swoją kolejautomatyczne zamykanie
IntentService
, poprzez połączenie zstopSelf()
, gdy kolejka jest pustaWszystko to można wdrożyć
Service
bez przedłużaniaIntentService
.źródło
Service
sprawdzone zstartService
może działać tylko przez około 10 sekund przed rzuceniem ANR -IntentService
rozpoczęcie nadawania zamiaru nie wydaje się mieć tego ograniczeniaonStartCommand()
aService
, 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.onStartCommand
zamiastonHandleIntent
- wygląda naonStartCommand
to, że jest uruchamiany w wątku interfejsu użytkownika, jednak doonHandleIntent
wykonania jest spawnowany osobny wątek .IntentService
sam to nazywa, poonHandleIntent()
powrocie, jeśli nie ma już pracy do wykonania.Usługa
startService()
Thread
Main Thread
stopSelf()
lubstopService()
IntentService
Handler
lubBroadcastReceiver
Intent
Main Thread
źródło
Nie wymyślaj koła ponownie
IntentService rozszerza klasę usług, co wyraźnie oznacza, że
IntentService
jest 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
)Service
Więc NIE ,
Service
może wykonać każde zadanie, któreIntentService
by wykonał. Jeśli twoje wymagania mieszczą się w wyżej wymienionych kryteriach, nie musisz pisać logiki wService
klasie. Więc nieIntentService
wymyślaj ponownie koła, ponieważ jest to koło wymyślone.Podstawowa różnica
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
IntentService
jest to idealne rozwiązanie.Jak
IntentService
jest zrobionyService
Normalnego uruchomienia usługi na UI wątek (dowolnego typu biegnie Android komponentowego wątku UI domyślnie np
Activity
,BroadcastReceiver
,ContentProvider
iService
). 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
.IntentService
otrzymuje domyślną implementację, która wykonuje te zadania za Ciebie.Według strony programisty
IntentService
tworzy wątek roboczyIntentService
tworzy kolejkę roboczą, która wysyła żądanie doonHandleIntent()
metody jedna po drugiejIntentService
wywołujestopSelf()
metodęonBind()
metody o wartości NULLonStartCommand()
której wysyłaIntent
żądanie do WorkQueue i ostatecznie doonHandleIntent()
źródło
Dodanie punktów do zaakceptowanej odpowiedzi:
Zobacz użycie IntentService w interfejsie API Androida. na przykład:
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 ...
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.
: 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
**
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
źródło
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ę.
źródło
IntentService
IntentService
dział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,IntentService
jeśli potrzebujesz - Możesz to osiągnąć za pomocąThreadPoolExecutor
. Mówię to, ponieważ wiele osób pytało mnie „po co korzystać,IntentService
ponieważ nie obsługuje równoległego wykonywania”.IntentService
to tylko wątek. Możesz zrobić w nim wszystko, czego potrzebujesz - nawet obracając wiele wątków. Jedynym zastrzeżeniem jest to, żeIntentService
koń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 stosowanieThreadPoolExecutor
w tych scenariuszach.Usługa
Domyślnie
Service
działa w głównym wątku. Musisz zakręcić wątek roboczy, aby wykonać swoją pracę. Musisz sięservice
wyraź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łowyservice
.Zawsze możesz komunikować się z powrotem na temat swojej aktywności, używając w
BroadcastReceivers
razie potrzeby.źródło
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.
źródło
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.
źródło
Główna różnica między a
Service
aIntentService
jest opisana następująco:Usługa :
1.A
Service
domyś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
IntentService
tutaj, 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.
źródło
Android IntentService vs Service
1. usługa
2. IntentService
Patrz tutaj
źródło