Klasa IntentService
zapewnia prostą strukturę do uruchamiania
operacji w pojedynczym wątku w tle. Dzięki temu może obsługiwać długotrwałe operacje
bez wpływu na szybkość reagowania interfejsu. Ponadto
Większość zdarzeń cyklu życia interfejsu użytkownika nie ma wpływu na IntentService
, dlatego
nadal działa w sytuacjach, które spowodowałyby wyłączenie AsyncTask
Element IntentService
ma kilka ograniczeń:
-
Nie może wchodzić w bezpośrednią interakcję z interfejsem. Aby umieścić wyniki w interfejsie,
wysłać je do
Activity
. -
Żądania robocze są uruchamiane po kolei. Jeśli operacja jest wykonywana w
IntentService
, a Ty wyślesz do niej kolejną prośbę, poczeka, aż pierwsza operacja jest zakończona. -
Nie można przerwać operacji uruchomionej na elemencie
IntentService
.
W większości przypadków jednak preferowanym sposobem działania jest IntentService
i prostych operacji w tle.
Z tego przewodnika dowiesz się, jak:
- Utwórz własną podklasę klasy
IntentService
. - Utwórz wymaganą metodę wywołania zwrotnego
onHandleIntent()
. - Zdefiniuj
IntentService
w pliku manifestu.
Obsługa intencji przychodzących
Aby utworzyć komponent IntentService
dla aplikacji, zdefiniuj klasę, która
rozszerza metodę IntentService
i w niej definiuje metodę, która
zastępuje wartość onHandleIntent()
. Na przykład:
Kotlin
class RSSPullService : IntentService(RSSPullService::class.simpleName) override fun onHandleIntent(workIntent: Intent) { // Gets data from the incoming Intent val dataString = workIntent.dataString ... // Do work here, based on the contents of dataString ... } }
Java
public class RSSPullService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { // Gets data from the incoming Intent String dataString = workIntent.getDataString(); ... // Do work here, based on the contents of dataString ... } }
Zwróć uwagę, że inne wywołania zwrotne zwykłego komponentu Service
, takie jak
Pole onStartCommand()
jest wywoływane automatycznie przez
IntentService
IntentService
: należy unikać
i zastępować te wywołania zwrotne.
Aby dowiedzieć się więcej o tworzeniu IntentService
, zapoznaj się z artykułem Przedłużanie
IntentService.
Określ usługę intencji w pliku manifestu
IntentService
wymaga też wpisu w manifeście aplikacji.
Udostępnij ten wpis jako
<service>
który jest elementem podrzędnym tagu
Element
<application>
:
<application android:icon="@drawable/icon" android:label="@string/app_name"> ... <!-- Because android:exported is set to "false", the service is only available to this app. --> <service android:name=".RSSPullService" android:exported="false"/> ... </application>
Atrybut android:name
określa nazwę klasy klasy
IntentService
Zwróć uwagę, że
<service>
element nie zawiera
filtr intencji.
Activity
, który wysyła do usługi żądania służbowe, używa
jednoznacznie Intent
, więc filtr nie jest potrzebny. To także
oznacza, że tylko komponenty znajdujące się w tej samej aplikacji lub w innych aplikacjach z tagiem
użytkownik o tym samym identyfikatorze użytkownika może uzyskać dostęp do usługi.
Po utworzeniu podstawowych zajęć w usłudze IntentService
możesz wysyłać prośby o pracę
za pomocą Intent
obiektów. Procedura tworzenia tych obiektów
i wysyłanie ich na urządzenie IntentService
opisano w
Wysyłanie próśb o pracę do usługi w tle.