Hintergrunddienst erstellen

Die Klasse IntentService bietet eine einfache Struktur zum Ausführen eines Vorgangs für einen einzelnen Hintergrundthread. Auf diese Weise können lang andauernde Vorgänge verarbeitet werden, ohne die Reaktionsfähigkeit Ihrer Benutzeroberfläche zu beeinträchtigen. Außerdem ist ein IntentService nicht von den meisten Lebenszyklusereignissen der Benutzeroberfläche betroffen. Daher wird es auch unter Umständen ausgeführt, in denen ein AsyncTask beendet würde.

Ein IntentService hat einige Einschränkungen:

  • Er kann nicht direkt mit Ihrer Benutzeroberfläche interagieren. Damit die Ergebnisse in der UI angezeigt werden, müssen Sie sie an ein Activity senden.
  • Arbeitsanfragen werden nacheinander ausgeführt. Wenn ein Vorgang in einem IntentService ausgeführt wird und Sie eine weitere Anfrage senden, wird mit der Ausführung der Anfrage gewartet, 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 jedoch ein IntentService die bevorzugte Methode, um einfache Hintergrundvorgänge auszuführen.

In diesem Leitfaden erfahren Sie, wie Sie Folgendes tun:

Eingehende Intents verarbeiten

Wenn Sie eine IntentService-Komponente für Ihre App erstellen möchten, definieren Sie eine Klasse, die IntentService erweitert, und definieren Sie darin eine Methode, die onHandleIntent() überschreibt. Beispiel:

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 einer IntentService sollten Sie diese Callbacks nicht überschreiben.

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 Element <application> 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 der IntentService an.

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

Nachdem Sie die grundlegende IntentService-Klasse erstellt haben, können Sie ihr Arbeitsanfragen mit Intent-Objekten senden. Wie Sie diese Objekte erstellen und an Ihre IntentService senden, wird unter Arbeitsanfragen an den Hintergrunddienst senden beschrieben.