La classe IntentService
fournit une structure simple permettant d'exécuter une opération sur un seul thread d'arrière-plan. Cela lui permet de gérer des opérations de longue durée sans affecter la réactivité de votre interface utilisateur. De plus, une IntentService
n'est pas affectée par la plupart des événements de cycle de vie de l'interface utilisateur. Elle continue donc de s'exécuter dans des circonstances susceptibles d'arrêter une AsyncTask
.
Un IntentService
présente quelques limites:
-
Elle ne peut pas interagir directement avec votre interface utilisateur. Pour placer ses résultats dans l'interface utilisateur, vous devez les envoyer vers 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
IntentService
et que vous lui envoyez une autre requête, celle-ci attend que la première opération soit terminée. -
Une opération exécutée sur un
IntentService
ne peut pas être interrompue.
Toutefois, dans la plupart des cas, il est préférable d'utiliser IntentService
pour effectuer des opérations simples en arrière-plan.
Ce guide vous explique comment effectuer les opérations suivantes:
- Créez votre propre sous-classe de
IntentService
. - Créez la méthode de rappel requise
onHandleIntent()
. - Définissez l'élément
IntentService
dans votre fichier manifeste.
Gérer les intents entrants
Pour créer un composant IntentService
pour votre application, définissez une classe qui étend IntentService
, puis dans cet élément, définissez une méthode qui remplace onHandleIntent()
. Par 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, tel que 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 É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 créer 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.