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:
- Erstellen Sie Ihre eigene abgeleitete Klasse von
IntentService
. - Erstellen Sie die erforderliche Callback-Methode
onHandleIntent()
. - Definiere
IntentService
in deiner Manifestdatei.
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.