Android
IntentService
Suche…
Syntax
- <service android: name = ". UploadS3IntentService" android: exported = "false" />
Bemerkungen
Ein IntentService
bietet eine einfache Möglichkeit, die Arbeit in einem Hintergrundthread IntentService
. Es erledigt alles für Sie, wenn Sie Anfragen empfangen, in eine Warteschlange stellen, sich selbst stoppen usw. Es ist auch einfach zu implementieren und daher ideal für zeitaufwendige Vorgänge, die nicht zum Main (UI) -Thread gehören.
Einen IntentService erstellen
Erstellen Sie zum Erstellen eines IntentService eine Klasse, die IntentService
, und darin eine Methode, die onHandleIntent
überschreibt:
package com.example.myapp;
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent (Intent workIntent) {
//Do something in the background, based on the contents of workIntent.
}
}
Beispielabsichts-Service
Hier ist ein Beispiel für einen IntentService
, der vorgibt, Bilder im Hintergrund zu laden. Zur Implementierung eines IntentService
müssen Sie IntentService
einen Konstruktor bereitstellen, der den super(String)
onHandleIntent(Intent)
, und Sie müssen die onHandleIntent(Intent)
-Methode implementieren.
public class ImageLoaderIntentService extends IntentService {
public static final String IMAGE_URL = "url";
/**
* Define a constructor and call the super(String) constructor, in order to name the worker
* thread - this is important if you want to debug and know the name of the thread upon
* which this Service is operating its jobs.
*/
public ImageLoaderIntentService() {
super("Example");
}
@Override
protected void onHandleIntent(Intent intent) {
// This is where you do all your logic - this code is executed on a background thread
String imageUrl = intent.getStringExtra(IMAGE_URL);
if (!TextUtils.isEmpty(imageUrl)) {
Drawable image = HttpUtils.loadImage(imageUrl); // HttpUtils is made-up for the example
}
// Send your drawable back to the UI now, so that you can use it - there are many ways
// to achieve this, but they are out of reach for this example
}
}
Um einen IntentService
zu starten, müssen Sie ihm eine Intent
senden. Sie können dies beispielsweise aus einer Activity
tun. Natürlich sind Sie nicht darauf beschränkt. Hier ein Beispiel, wie Sie Ihren neuen Service
aus einer Activity
abrufen würden.
Intent serviceIntent = new Intent(this, ImageLoaderIntentService.class); // you can use 'this' as the first parameter if your class is a Context (i.e. an Activity, another Service, etc.), otherwise, supply the context differently
serviceIntent.putExtra(IMAGE_URL, "http://www.example-site.org/some/path/to/an/image");
startService(serviceIntent); // if you are not using 'this' in the first line, you also have to put the call to the Context object before startService(Intent) here
Die IntentService
verarbeitet die Daten von seiner Intent
s sequentiell, so dass Sie mehrere senden Intent
s , ohne sich Gedanken , ob sie miteinander kollidieren. Es wird jeweils nur eine Intent
verarbeitet, der Rest wird in eine Warteschlange gestellt. Wenn alle Jobs abgeschlossen sind, wird der IntentService
automatisch heruntergefahren.
Grundlegendes IntentService-Beispiel
Die abstrakte Klasse IntentService
ist eine Basisklasse für Dienste, die im Hintergrund ohne Benutzeroberfläche ausgeführt werden. Um die Benutzeroberfläche zu aktualisieren, müssen wir daher einen Empfänger verwenden, der entweder ein BroadcastReceiver
oder ein ResultReceiver
:
- Ein
BroadcastReceiver
sollte verwendet werden, wenn Ihr Dienst mit mehreren Komponenten kommunizieren muss, die auf Kommunikation warten möchten. - Ein
ResultReceiver
: sollte verwendet werden, wenn Ihr Dienst nur mit der übergeordneten Anwendung (dh Ihrer Anwendung) kommunizieren muss.
Innerhalb des IntentService
haben wir eine Schlüsselmethode, onHandleIntent()
, in der wir alle Aktionen ausführen, z.
Wenn Sie IntentService
eigenen IntentService
verwenden IntentService
, müssen Sie ihn wie folgt erweitern:
public class YourIntentService extends IntentService {
public YourIntentService () {
super("YourIntentService ");
}
@Override
protected void onHandleIntent(Intent intent) {
// TODO: Write your own code here.
}
}
Das Aufrufen / Starten der Aktivität kann wie folgt durchgeführt werden:
Intent i = new Intent(this, YourIntentService.class);
startService(i); // For the service.
startActivity(i); // For the activity; ignore this for now.
Ähnlich wie bei jeder Aktivität können Sie zusätzliche Informationen wie Bündeldaten wie folgt übergeben:
Intent passDataIntent = new Intent(this, YourIntentService.class);
msgIntent.putExtra("foo","bar");
startService(passDataIntent);
YourIntentService
jetzt an, dass wir einige Daten an die YourIntentService
Klasse übergeben haben. Basierend auf diesen Daten kann eine Aktion wie folgt ausgeführt werden:
public class YourIntentService extends IntentService {
private String actvityValue="bar";
String retrivedValue=intent.getStringExtra("foo");
public YourIntentService () {
super("YourIntentService ");
}
@Override
protected void onHandleIntent(Intent intent) {
if(retrivedValue.equals(actvityValue)){
// Send the notification to foo.
} else {
// Retrieving data failed.
}
}
}
Der obige Code zeigt auch, wie mit Einschränkungen in der OnHandleIntent()
Methode OnHandleIntent()
wird.