Tworzenie usługi w tle

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:

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.