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