Sök…


Syntax

  1. <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() .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow