Recherche…


Syntaxe

  1. <service android: name = ". UploadS3IntentService" android: exporté = "false" />

Remarques

Un IntentService fournit un moyen simple de décharger le travail sur un thread d'arrière-plan. Il gère tout ce qui concerne la réception des demandes, leur mise en attente, leur arrêt, etc. pour vous. Il est également facile à mettre en œuvre, ce qui en fait la solution idéale lorsque vous avez des opérations fastidieuses à effectuer qui n'appartiennent pas au thread principal (UI).

Créer un IntentService

Pour créer un IntentService, créez une classe qui étend IntentService , et en son sein, une méthode qui remplace 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.
     }
}

Exemple de service d'intention

Voici un exemple de IntentService qui prétend charger des images en arrière-plan. Tout ce que vous devez faire pour implémenter un IntentService est de fournir un constructeur qui appelle le constructeur super(String) , et vous devez implémenter la 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
    }
}

Pour lancer IntentService , vous devez lui envoyer une Intent . Vous pouvez le faire à partir d'une Activity , par exemple. Bien sûr, vous n'êtes pas limité à cela. Voici un exemple de la façon dont vous invoqueriez votre nouveau Service partir d'une classe d' 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 traite les données de ses Intent manière séquentielle, de sorte que vous pouvez envoyer plusieurs Intent sans vous soucier de savoir si elles entrent en collision. Seule une Intent à la fois est traitée, les autres vont dans une file d'attente. Lorsque tous les travaux sont terminés, IntentService s'arrête automatiquement.

Exemple de base IntentService

La classe abstraite IntentService est une classe de base pour les services, qui s'exécutent en arrière-plan sans aucune interface utilisateur. Par conséquent, pour mettre à jour l'interface utilisateur, nous devons utiliser un récepteur, qui peut être un BroadcastReceiver ou un ResultReceiver :

  • Un BroadcastReceiver doit être utilisé si votre service doit communiquer avec plusieurs composants souhaitant écouter les communications.
  • Un ResultReceiver : doit être utilisé si votre service doit communiquer uniquement avec l'application parente (c'est-à-dire votre application).

Dans IntentService , nous avons une méthode clé, onHandleIntent() , dans laquelle nous allons effectuer toutes les actions, par exemple, préparer des notifications, créer des alarmes, etc.

Si vous souhaitez utiliser votre propre IntentService , vous devez l'étendre comme suit:

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

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

L'appel / démarrage de l'activité peut se faire comme suit:

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

Semblable à toute activité, vous pouvez lui transmettre des informations supplémentaires, telles que des données de regroupement, comme suit:

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

Supposons maintenant que nous avons transmis des données à la classe YourIntentService . Sur la base de ces données, une action peut être effectuée comme suit:

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

Le code ci-dessus montre également comment gérer les contraintes dans la méthode OnHandleIntent() .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow