Android
IntentService
Sök…
Syntax
- <service android: name = ". UploadS3IntentService" android: exporterat = "falskt" />
Anmärkningar
En IntentService
tillhandahåller ett enkelt sätt att ladda ner arbete på en bakgrundstråd. Den hanterar allt om att ta emot förfrågningar, sätta dem i en kö, stoppa sig själv etc. för dig. Det är också lätt att implementera, vilket gör det till det perfekta att använda när du har tidskrävande åtgärder för att göra det som inte hör till Main (UI) -tråden.
Skapa en IntentService
För att skapa en IntentService, skapa en klass som utvidgar IntentService
och inom den en metod som åsidosätter onHandleIntent
:
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.
}
}
Provintenttjänst
Här är ett exempel på en IntentService
som låtsas ladda bilder i bakgrunden. Allt du behöver göra för att implementera en IntentService
är att tillhandahålla en konstruktör som kallar super(String)
och du behöver implementera onHandleIntent(Intent)
.
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
}
}
För att starta en IntentService
måste du skicka en Intent
till den. Du kan göra det från en Activity
, till exempel. Naturligtvis är du inte begränsad till det. Här är ett exempel på hur du skulle kalla till din nya Service
från en Activity
.
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
IntentService
bearbetar uppgifterna från sina Intent
följd, så att du kan skicka flera Intent
utan att oroa dig för om de kommer att kollidera med varandra. Endast en Intent
i taget behandlas, resten går i kö. När alla jobb är klar IntentService
automatiskt av sig själv.
Grundläggande IntentService-exempel
Den abstrakta klassen IntentService
är en basklass för tjänster som körs i bakgrunden utan något användargränssnitt. För att uppdatera användargränssnittet måste vi därför använda en mottagare, som kan vara antingen en BroadcastReceiver
eller en ResultReceiver
:
- En
BroadcastReceiver
bör användas om din tjänst behöver kommunicera med flera komponenter som vill lyssna för kommunikation. - En
ResultReceiver
: ska användas om din tjänst behöver bara kommunicera med moderapplikationen (dvs. din ansökan).
Inom IntentService
har vi en nyckelmetod, onHandleIntent()
, där vi kommer att göra alla åtgärder, till exempel, förbereda aviseringar, skapa larm, etc.
Om du vill använda din egen IntentService
måste du utvidga den enligt följande:
public class YourIntentService extends IntentService {
public YourIntentService () {
super("YourIntentService ");
}
@Override
protected void onHandleIntent(Intent intent) {
// TODO: Write your own code here.
}
}
Att ringa / starta aktiviteten kan göras enligt följande:
Intent i = new Intent(this, YourIntentService.class);
startService(i); // For the service.
startActivity(i); // For the activity; ignore this for now.
I likhet med alla aktiviteter kan du skicka extra information som paketdata till den på följande sätt:
Intent passDataIntent = new Intent(this, YourIntentService.class);
msgIntent.putExtra("foo","bar");
startService(passDataIntent);
Anta nu att vi skickade en del data till klassen YourIntentService
. Baserat på dessa data kan en åtgärd utföras enligt följande:
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.
}
}
}
Koden ovan visar också hur man hanterar begränsningar i OnHandleIntent()
.