:: Enseignements :: Master :: M2 :: 2012-2013 :: Développement Android ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Services Android |
L'objectif de ce TD est d'implanter quelques services communiquant à l'aide d'Intent ou par l'intermédiaire d'appels de méthodes inter-processus.
Exercice 1 - Un service de factorisation
On souhaite adapter l'activité précédente de factorisation en tant que service. Nous souhaitons ainsi créer un activité consacrée à la soumission de travaux de factorisation, un service exécutant les travaux de factorisation ainsi qu'une activité affichant le résultat d'une factorisation.
- Créer une activité demandant l'entrée d'un entier avec un bouton de validation (qui pour l'instant affichera un toast avec le nombre).
- Créer un service de factorisation d'entier. Le service réceptionne des Intent contenant en paramètre extra l'entier à factoriser. Si l'on est courageux, on pourra dériver la classe Service en rédéfinissant onStartCommand() et en utilisant une seule thread de travail ; sinon on pourra utiliser pour base un IntentService.
- Adapter le service afin qu'il puisse exploiter un pool de threads pour réaliser les calculs (afin de pouvoir mener plusieurs factorisations simultanément).
- Notre service réalise des factorisations mais nous n'avons pas de moyen de récupérer ses résultats. À cet effet, nous souhaitons informer l'utilisateur de l'achèvement d'un travail de factorisation. Pour cela afficher une notification signalant la fin d'un travail : on créera une activité spéciale qui sera appelée sur un clic de la notification afin d'afficher la factorisation.
- [Bonus] Afficher également une notification pour signaler un calcul en cours avec une barre de progression (pessimiste).
Exercice 2 - Un service de téléchargement de pages web
Nous souhaitons réaliser un service de téléchargement de pages web. Il pourra par exemple être utilisé par l'activité d'affichage de flux de syndication afin de télécharger des fichiers Atom.
- Créer un service recevant des Intent contenant une URL de page à télécharger et la fréquence de récupération. Le service maintient en mémoire une liste des URLs, leur fréquence de récupération, la date de dernière mise à jour ainsi que le dernier contenu téléchargé (sous forme de byte[]). Une thread de travail vérifie régulièrement si une page doit être rafraîchie : dans cette situation, la page est mise à jour en la téléchargeant.
- Diffuser un broadcast signalant qu'une page a été mise à jour ; l'Intent devra contenir un objet Page contenant URL, date de dernière mise à jour et contenu de la page. La classe Page devra implanter l'interface Parcable afin d'être sérialisable/désérialisable dans un Intent.
- Réaliser une activité de test réclamant au service la récupération d'une URL et enregistrant un récepteur de broadcast pour être informée des mises à jour. On pourra afficher la page dans un WebView.
L'utilisation d'Intent pour la communication n'est pas très pratique (notamment l'incorporation de données volumineuses dans un Intent diffusé). On souhaite changer le mode d'utilisation de notre service en exposant une interface pour des appels RPC.
- Écrire une interface AIDL pour le service exposant deux méthodes Page registerURL(String url, int frequency) pour inscrire une URL à surveiller et boolean unregisterURL(String url) pour supprimer une URL à surveiller. La méthode d'enregistrement retourne la dernière version de la page si celle-ci est en mémoire (la fréquence pourra être modifiée) ou null si aucune récupération n'a déjà été réalisée sur cette page.
- Créer un fichier d'en-tête AIDL pour la classe Page.
- Implanter une instance de la souche générée depuis l'interface AIDL du service. Retourner une telle instance par la méthode getBinder() du service.
- Modifier l'afficheur de flux de syndication d'un précédent TD afin de tester le service.
- Réfléchir aux problématiques de sécurité. N'importe quelle application peut-elle utiliser le service ? Si oui proposer un moyen de résoudre cette épineuse question.
- A quel moment le service est-il arrêté ? Proposer un moyen afin de faire survivre le service.
© Université de Marne-la-Vallée