Créer un service d'arrière-plan

La classe IntentService fournit une structure simple pour exécuter une opération sur un seul thread d'arrière-plan. Cela lui permet de gérer les opérations de longue durée sans affecter la réactivité de votre interface utilisateur. De plus, un IntentService n'est pas affecté par la plupart des événements de cycle de vie de l'interface utilisateur. Il continue donc de s'exécuter dans des circonstances qui entraîneraient l'arrêt d'un AsyncTask.

Une IntentService présente certaines limites:

  • Il ne peut pas interagir directement avec votre interface utilisateur. Pour placer ses résultats dans l'UI, vous devez les envoyer à un Activity.
  • Les requêtes de travail sont exécutées de manière séquentielle. Si une opération est en cours d'exécution dans un objet IntentService et que vous lui envoyez une autre requête, celle-ci attend la fin de la première opération.
  • Une opération exécutée sur un IntentService ne peut pas être interrompue.

Toutefois, dans la plupart des cas, un IntentService est le moyen privilégié pour effectuer des opérations simples en arrière-plan.

Ce guide vous explique comment :

Gérer les intents entrants

Pour créer un composant IntentService pour votre application, définissez une classe qui étend IntentService et, dans celle-ci, définissez une méthode qui remplace onHandleIntent(). Exemple :

Kotlin

class RSSPullService : IntentService(RSSPullService::class.simpleName)

    override fun onHandleIntent(workIntent: Intent) {
        // Gets data from the incoming Intent
        val dataString = workIntent.dataString
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Java

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Notez que les autres rappels d'un composant Service standard, comme onStartCommand(), sont automatiquement appelés par IntentService. Dans un IntentService, vous devez éviter de remplacer ces rappels.

Pour en savoir plus sur la création d'un IntentService, consultez la section Étendre la classe IntentService.

Définir le service d'intent dans le fichier manifeste

Un IntentService a également besoin d'une entrée dans le fichier manifeste de votre application. Fournissez cette entrée en tant qu'élément <service> qui est un enfant de l'élément <application>:

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    </application>

L'attribut android:name spécifie le nom de classe de IntentService.

Notez que l'élément <service> ne contient pas de filtre d'intent. Le Activity qui envoie des requêtes de travail au service utilise un Intent explicite. Aucun filtre n'est donc nécessaire. Cela signifie également que seuls les composants de la même application ou d'autres applications ayant le même ID utilisateur peuvent accéder au service.

Maintenant que vous disposez de la classe IntentService de base, vous pouvez lui envoyer des requêtes de travail avec des objets Intent. La procédure permettant de construire ces objets et de les envoyer à votre IntentService est décrite dans la section Envoyer des requêtes de travail au service d'arrière-plan.