Tworzenie usługi w tle

Klasa IntentService zapewnia prostą strukturę do wykonywania operacji na jednym wątku w tle. Dzięki temu może obsługiwać długotrwałe operacje bez wpływu na czas reakcji interfejsu. Ponadto IntentService nie jest zależny od większości zdarzeń cyklu życia interfejsu użytkownika, więc działa nadal w okolicznościach, w których AsyncTask zostałby zamknięty.

Element IntentService ma kilka ograniczeń:

  • Nie może wchodzić w bezpośrednią interakcję z interfejsem. Aby wyświetlić wyniki w interfejsie, musisz je wysłać do Activity.
  • Żądania robocze są uruchamiane po kolei. Jeśli podczas wykonywania operacji w IntentService wyślesz do niego kolejne żądanie, żądanie oczekuje na zakończenie pierwszej operacji.
  • Operacji wykonywanej na zasobie IntentService nie można przerwać.

W większości przypadków preferowaną metodą wykonywania prostych operacji w tle jest jednak IntentService.

Z tego przewodnika dowiesz się, jak:

Obsługa intencji przychodzących

Aby utworzyć komponent IntentService dla aplikacji, zdefiniuj klasę, która rozszerza IntentService, a w niej określ metodę, która zastępuje 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, np. onStartCommand(), są automatycznie wywoływane przez IntentService. W IntentService nie należy zastępować tych funkcji zwracających wartości.

Więcej informacji o tworzeniu klasy IntentService znajdziesz w artykule Rozszerzanie klasy IntentService.

Określ usługę intencji w pliku manifestu

Element IntentService musi też mieć wpis w pliku manifestu aplikacji. Podaj ten wpis jako element <service>, który jest elementem podrzędnym elementu <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 IntentService.

Zauważ, że element <service> nie zawiera filtra intencji. W Activity, który wysyła żądania służbowe do usługi, używa jawnego identyfikatora Intent, więc filtr nie jest potrzebny. Oznacza to też, że dostęp do usługi mają tylko komponenty w tej samej aplikacji lub inne aplikacje z tym samym identyfikatorem użytkownika.

Gdy masz już podstawowy typ zajęć IntentService, możesz wysyłać do niego prośby o zadania z obiektami Intent. Procedura tworzenia tych obiektów i wysyłania ich do IntentService jest opisana w artykule Wysyłanie żądań wykonania do usługi działającej w tle.