Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:19:45 +0100 2011
Chapitre 30
Création d’un service 307
Notez que, si votre service doit simplement alerter l’utilisateur d’un certain événement,
vous pouvez utiliser une notification, qui est le moyen le plus classique de gérer ce type de
scénario.
Méthodes de rappel
Une activité pouvant travailler directement avec un service local, elle peut fournir une
sorte d’objet "écouteur" au service, que ce dernier pourra ensuite appeler au besoin. Pour
que ceci fonctionne, vous devez agir comme suit :
1. Définissez une interface Java pour cet objet écouteur.
2. Donnez au service une API publique pour enregistrer et supprimer des écouteurs.
3. Faites en sorte que le service utilise ces écouteurs au bon moment, pour prévenir ceux
qui ont enregistré l’écouteur d’un événement donné.
4. Faites en sorte que l’activité enregistre et supprime un écouteur en fonction de ses
besoins.
5. Faites en sorte que l’activité réponde correctement aux événements gérés par les écouteurs.
La plus grande difficulté consiste à s’assurer que l’activité inactive les écouteurs
lorsqu’elle se termine. Les objets écouteurs connaissent généralement leur activité, soit
explicitement (via un membre) soit implicitement (en étant implémentés comme une
classe interne). Si le service repose sur des objets écouteurs qui ont été inactivés, les activités correspondantes resteront en mémoire, même si elles ne sont plus utilisées par
Android. Ceci crée donc une fuite mémoire importante. Vous pouvez utiliser des WeakReference, des SoftReference ou des constructions similaires pour garantir que les écouteurs enregistrés par une activité pour votre service ne maintiendront pas cette dernière en
mémoire lorsqu’elle est supprimée.
Intentions diffusées
Une autre approche que nous avions déjà mentionnée au chapitre consacré aux filtres
d’intention consiste à faire en sorte que le service lance une intention diffusée qui pourra
être capturée par l’activité, en supposant que cette dernière existe encore et ne soit pas en
pause. Nous examinerons le côté client de cet échange au prochain chapitre mais, pour le
moment, intéressons-nous à la façon dont un service peut envoyer une telle intention.
L’implémentation de haut niveau du flux est empaquetée dans FetchForecastTask, une
implémentation d’AsyncTask qui nous permet de déplacer l’accès Internet vers un thread
en arrière-plan :
class FetchForecastTask extends AsyncTask {
@Override
protected Void doInBackground(Location... locs) {
Location loc=locs[0];
Livre Android.book Page 307 Dimanche, 8. novembre 2009 12:23 12
Précédent

- 322/391

Suivant