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.