Formation Android, tutoriel & guide de travaux pratiques en pdf.
Les services (threads, cycle de vie…)
Les services ont pour but de réaliser des tâches de fond sans aucune interaction avec l’utilisateur pour une durée indéfinie. Il existe deux type de services :
• les services locaux (ou LocalService) qui s’exécutent dans le même processus que votre application
• Les services distants (ou RemoteService) qui s’exécutent dans un processus différent de celui de application
Les services s’exécutent dans le Thread principal du processus parent. Ils doivent être déclarés dans le fichier AndroidManifest.xml:
<service android:name= ».subpackagename.ServiceName »/>
Ils doivent étendre la classe Service dont vous devrez surcharger les méthodes suivantes en fonction de vos besoins :
void onCreate(); // initialisation des ressources
void onStart(Intent intent); // SDK<2.0 la tâche de fond démarre
void onStartCommand(Intent intent, int flags, int startId); // SDK>2.0 la tâche de fond démarre
void onDestroy(); // libération des ressources
IBinder onBind(Intent intent); // connexion client distant boolean onUnbind(Intent intent); // déconnexion d’un client void onRebind(Intent intent)
Google a publié un post sur la méthode onStartCommand() apparue avec le SDK 2.0 : http://android-‐developers.blogspot.com/2010/02/service-‐api-‐changes-‐starting-‐ with.html
La méthode onStart() est dépréciée mais doit être redéfinie pour une compatibilité avec les SDK antérieurs (si nécessaire).
Quant au cycle de vie d’un service, Google l’illustre de la manière suivante :
Pour interagir (demarrer/arrêter…) avec un service, deux possibilités s’offrent à nous :
• Soit on appelle la méthode startService() qui invoque la méthode onCreate() puis onStart()
service.startService() | -‐> onCreate() -‐ > onStartCommand() [service running] L’appel de la méthode stopService() invoque la méthode onDestroy()
• Soit on appelle la méthode bindService() qui appelle uniquement la méthode onCreate()
activity.bindService() | -‐>onCreate() [service created]
Il est possible de voir la liste des services exécutés en allant dans Menu > Settings >
Applications > Running Services > du téléphone:
Services locaux (LocalService)
Définition du service
Un service Local n’est accessible que par les Activity de l’application.
Pour l’exemple, notre service initialise un Timer et une tâche qui sera exécutée toutes les minutes. Nous allons créer une classe héritant de Service et surcharger les méthodes onCreate(), onStart() et onDestroy().
public class BackgroundService extends Service {
private Timer timer ;
@Override
public void onCreate() {
super.onCreate();
timer = new Timer();
Log.d(this.getClass().getName(), « onCreate »);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) { Log.d(this.getClass().getName(), « onStart »); timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
// Executer de votre tâche
}
}, 0, 60000);
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
Log.d(this.getClass().getName(), « onDestroy »);
this.timer.cancel();
}
A faire :
I°) Modifier votre programme pour qu’il affiche toutes les secondes dans le « Logger » l’heure au format suivant : heure:minute:seconde. Pour se faire vous pourrez utiliser le classe Date.
II°) Les modes d’exécution des services.
A partir du texte suivant extrait de la documentation Android ( http://developer.android.com/reference/android/app/Service.html) expliquez quel est l’impact du mot clé START_NOT_STICKY.
« For started services, there are two additional major modes of operation they can decide to run in, depending on the value they return from onStartCommand(): START_STICKY is used for services that are explicitly started and stopped as needed, while START_NOT_STICKY or START_REDELIVER_INTENT are used for services that should only
remain running while processing any commands sent to them. See the linked documentation for more detail on the semantics. »
Déclaration du service
Nous déclarons le service dans le fichier AndroidManifest.xml à l’intérieur de la balise <application> :
<service android:name= ».BackgroundService » />
Pour le démarrer, nous faisons appel à la méthode startService(Intent) de l’Activity prenant en paramêtre un Intent. Ce dernier peut être initialisé de deux manières :
• Soit en lui passant explicitement le context de l’application et la class du service.
Intent intent = new Intent(this,BackgroundService.class); startService(intent);
• Soit en déclarant une action dans le fichier AndroidManifest.xml…
<service android:enabled= »true » android:name= ».BackgroundService »> <intent-filter>
<action android:name= ».BackgroundService.ACTION » /> </intent-filter>
</service> … que nous passons au constructeur de l’intent
Intent intent = new Intent(« .BackgroundService.ACTION »); startService(intent);
Il est possible de passer des objets complets serialisables en paramètre avec les méthodes intent.putExtra(…). Les objets pourront être récupérer dans la
méthode onStart(Intent intent, int startId) du service avec intent.getExtras().get(String key). Le fonctionnement est similaire à une table de Hash.
Pour arrêter notre service :
Intent intent = new Intent(this,BackgroundService.class); stopService(intent);
A faire
I°) Placer le démarrage du service pour qu’il démarre lors de l’appuie sur le bouton « start ».
Intent intent = new
Intent(VotreActivity.this,BackgroundService.class);
startService(intent);
II°) Placer le stoppage du service pour qu’il s’arrête lors de l’appuie sur le bouton « stop».
Intent intent = new Intent(VotreActivity
.this,BackgroundService.class);
stopService(intent);
III°) Vérifier dans votre émulateur que le service à bien été créé.
1°) Objectif
2°) Création de l’interface graphique
a°)La vue graphique
b°) Les composants graphiques
c°) Les évènements
3°) Les services (threads, cycle de vie…)
4°) Services locaux (LocalService)
a°) Définition du service
b°) A faire
c°) Déclaration du service
d°) A faire
5°) Implémentation des listeners
a°) Quelques concepts JAVA
b°) Les listeners sur les services
d°) A faire
6°) Implémentation d’un binder
7°) Connexion au service
a°) A faire
8°) Déconnexion au service
9°) Compte Rendu