Tworzenie usługi w tle

Klasa IntentService zapewnia prostą strukturę umożliwiającą uruchamianie operacji w jednym wątku w tle. Pozwala to obsługiwać długotrwałe operacje bez wpływu na szybkość reagowania interfejsu użytkownika. Ponadto większość zdarzeń cyklu życia interfejsu użytkownika nie wpływa na IntentService, więc będzie nadal działać w sytuacjach, w których wyłączenie interfejsu AsyncTask spowoduje wyłączenie interfejsu AsyncTask

Element IntentService ma kilka ograniczeń:

  • Nie może ona wchodzić w bezpośrednią interakcję z interfejsem użytkownika. Aby umieścić jego wyniki w interfejsie, musisz wysłać je do: Activity.
  • Żądania robocze są uruchamiane po kolei. Jeśli w obiekcie IntentService wykonywana jest operacja, a Ty wyślesz do niej kolejne żądanie, będzie ono czekać na zakończenie pierwszej operacji.
  • Operacja działającej na IntentService nie może zostać przerwana.

Jednak w większości przypadków preferowanym sposobem wykonywania prostych operacji w tle jest IntentService.

W tym przewodniku pokazujemy, jak:

Obsługuj intencje przychodzące

Aby utworzyć komponent IntentService dla swojej aplikacji, zdefiniuj klasę, która rozszerza zakres IntentService, a w jej obrębie zdefiniuj metodę, która zastępuje właściwość 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 onStartCommand(), są wywoływane automatycznie przez IntentService. W IntentService należy unikać zastępowania tych wywołań zwrotnych.

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

Zdefiniuj usługę intencji w pliku manifestu

IntentService musi też mieć wpis w pliku manifestu aplikacji. Podaj tę pozycję 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.

Zwróć uwagę, że element <service> nie zawiera filtra intencji. Activity, który wysyła do usługi żądania robocze, używa jawnego 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ż podstawową klasę IntentService, możesz wysyłać do niej żądania robocze za pomocą obiektów Intent. Procedura tworzenia tych obiektów i wysyłania ich do IntentService jest opisana w sekcji Wysyłanie żądań roboczych do usługi w tle.