Zoeken…


Syntaxis

  1. <service android: name = ". UploadS3IntentService" android: geëxporteerd = "false" />

Opmerkingen

Een IntentService biedt een eenvoudige manier om werk op een achtergrondthread te ontladen. Het behandelt alles over het ontvangen van aanvragen, ze in een wachtrij plaatsen, zichzelf stoppen, etc. voor u. Het is ook eenvoudig te implementeren, waardoor het perfect is om te gebruiken wanneer u tijdrovende bewerkingen moet uitvoeren die niet op de hoofdthread (UI) thuishoren.

Een IntentService maken

Om een IntentService te maken, maakt u een klasse die IntentService , en daarin een methode die onHandleIntent overschrijft:

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.
     }
}

Voorbeeld intentie service

Hier is een voorbeeld van een IntentService die doet alsof hij afbeeldingen op de achtergrond laadt. Het enige dat u hoeft te doen om een IntentService te implementeren, is om een constructor te bieden die de super(String) -constructor aanroept, en u moet de methode onHandleIntent(Intent) implementeren.

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
    }
}

Om een IntentService te starten, moet u er een Intent IntentService sturen. U kunt dit bijvoorbeeld doen vanuit een Activity . Natuurlijk ben je daar niet toe beperkt. Hier is een voorbeeld van hoe u uw nieuwe Service uit een Activity zou oproepen.

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

De IntentService verwerkt de gegevens van de Intent s opeenvolgend, zodat u meerdere Intent s kunt verzenden zonder u zorgen te maken of ze met elkaar botsen. Er wordt slechts één Intent tegelijk verwerkt, de rest gaat in een wachtrij. Wanneer alle taken zijn voltooid, wordt de IntentService automatisch uitgeschakeld.

Basic IntentService-voorbeeld

De abstracte klasse IntentService is een basisklasse voor services die op de achtergrond worden uitgevoerd zonder gebruikersinterface. Om de UI bij te werken, moeten we daarom gebruik maken van een ontvanger, die een BroadcastReceiver of een ResultReceiver :

  • Een BroadcastReceiver moet worden gebruikt als uw service moet communiceren met meerdere componenten die naar communicatie willen luisteren.
  • Een ResultReceiver : moet worden gebruikt als uw service alleen met de bovenliggende applicatie (dwz uw applicatie) hoeft te communiceren.

Binnen de IntentService hebben we één belangrijke methode, onHandleIntent() , waarin we alle acties zullen uitvoeren, bijvoorbeeld het voorbereiden van meldingen, het creëren van alarmen, etc.

Als u uw eigen IntentService wilt gebruiken, moet u deze als volgt uitbreiden:

public class YourIntentService extends IntentService {
    public YourIntentService () {
        super("YourIntentService ");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // TODO: Write your own code here.
    }
}    

Het aanroepen / starten van de activiteit kan als volgt worden gedaan:

Intent i = new Intent(this, YourIntentService.class);
startService(i);  // For the service.
startActivity(i); // For the activity; ignore this for now.

Net als bij elke activiteit kunt u er als volgt extra informatie zoals bundeldata aan doorgeven:

Intent passDataIntent = new Intent(this, YourIntentService.class);
msgIntent.putExtra("foo","bar");
startService(passDataIntent);

Ga er nu van uit dat we enkele gegevens hebben doorgegeven aan de klasse YourIntentService . Op basis van deze gegevens kan een actie als volgt worden uitgevoerd:

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.
        }    
    }
}

De bovenstaande code laat ook zien hoe met beperkingen moet worden omgegaan in de methode OnHandleIntent() .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow