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
IntentServicew 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.