Hintergrunddienst erstellen

Die Klasse IntentService bietet eine einfache Struktur zum Ausführen eines Vorgangs für einen einzelnen Hintergrundthread. So lassen sich lang andauernde Vorgänge verarbeiten, ohne die Reaktionsfähigkeit der Benutzeroberfläche zu beeinträchtigen. Außerdem ist ein IntentService von den meisten Lebenszyklusereignissen der Benutzeroberfläche nicht betroffen. Daher wird er weiter ausgeführt, wenn ein AsyncTask-Objekt heruntergefahren wird.

Ein IntentService hat einige Einschränkungen:

  • Es kann nicht direkt mit Ihrer Benutzeroberfläche interagieren. Um die Ergebnisse in die UI einzufügen, müssen Sie sie an ein Activity senden.
  • Arbeitsanfragen werden nacheinander ausgeführt. Wenn ein Vorgang in einer IntentService ausgeführt wird und Sie eine weitere Anfrage senden, wartet die Anfrage, bis der erste Vorgang abgeschlossen ist.
  • Ein Vorgang, der auf einem IntentService ausgeführt wird, kann nicht unterbrochen werden.

In den meisten Fällen ist ein IntentService jedoch die bevorzugte Methode, um einfache Hintergrundvorgänge auszuführen.

In diesem Leitfaden finden Sie folgende Anleitungen:

Eingehende Intents verarbeiten

Definieren Sie zum Erstellen einer IntentService-Komponente für Ihre Anwendung eine Klasse, die IntentService erweitert, und definieren Sie darin eine Methode, die onHandleIntent() überschreibt. Beispiele:

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

Die anderen Callbacks einer regulären Service-Komponente wie onStartCommand() werden automatisch von IntentService aufgerufen. In einem IntentService sollten diese Callbacks nicht überschrieben werden.

Weitere Informationen zum Erstellen eines IntentService finden Sie unter IntentService-Klasse erweitern.

Intent-Dienst im Manifest definieren

Für IntentService ist außerdem ein Eintrag in deinem Anwendungsmanifest erforderlich. Geben Sie diesen Eintrag als <service>-Element an, das dem <application>-Element untergeordnet ist:

    <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>

Das Attribut android:name gibt den Klassennamen von IntentService an.

Das Element <service> enthält keinen Intent-Filter. Der Activity, der Arbeitsanfragen an den Dienst sendet, verwendet ein explizites Intent, sodass kein Filter erforderlich ist. Das bedeutet auch, dass nur Komponenten in derselben Anwendung oder andere Anwendungen mit derselben Nutzer-ID auf den Dienst zugreifen können.

Da Sie nun die Basisklasse IntentService haben, können Sie Arbeitsanfragen mit Intent-Objekten an sie senden. Wie Sie diese Objekte erstellen und an den IntentService senden, erfahren Sie unter Arbeitsanfragen an den Hintergrunddienst senden.