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:

KotlinJava
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
       
...
   
}
}
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.