Pour implémenter un service, il suffit de créer une classe qui hérite de la classe Service ou IntentService. Ensuite cette nouvelle classe doit implémenter les différents callbacks en fonction du type de service qui doit être réalisé. Cette classe doit surcharger les méthodes onStartCommand, OnBind(), OnCreate(), OnDestroy(). Typiquement, le code d’un service correspond au squelette suivant :
package org.uva.myservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyServiceCompter extends Service { public MyServiceCompter() {
}
@Override
public void onCreate() { }
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// Retourne null si ce n’est pas un service de type Bind return null;
}
@Override
public void onDestroy() {
} }
Sous Android Studio, la création de Service est assez simple. Les étapes sont les suivantes : Il faut faire un clic droit sur le répertoire racine du projet, New → Service → Service
Figure 3 Création d’un Service sur Android Studio
Ensuite, il faut donner un nom au Service
Figure 4 Formulaire de création du service Le code qui sera généré a la structure suivante (celle d’un service bound)
Figure 5 Exemple de code généré par Android Studio pour les services
Le service est aussi déclaré automatiquement dans le fichier manifest du projet
<service
android:name=”.MyServiceCompter”
android:enabled=”true”
android:exported=”true” >
</service>
Figure 6 Déclaration du service dans le fichier manifest
La variable android:exported=”true” permet de contrôler l’accès à votre service par d’autres Activités. Si elle est à true, les autres applications peuvent lancer votre service, sinon le service sera exclusivement lancé par votre application.
Pour pouvoir utiliser ce service, il faut compléter les méthodes (callback) à implémenter surtout onStartCommand(). Si le service fait une longue tache alors, il est recommandé de le mettre dans un thread différent du thread principal. Le code suivant est un exemple d’implémentation de la methode onStartCommand :
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Creation d’un nouveau Thread pour le service
//Toujours écrire vos tâches de longue durée dans un thread séparé, afin d’éviter l’erreur ANR
new Thread(new Runnable() {
@Override
public void run() {
//La logique du service est écrite ici for (int i = 0; i <5; i++) {
try {
Thread.sleep(1000);
} catch (Exception e) { }
if(isRunning){
Log.i(TAG, “Le compteur est à “ + i);
} }
//Arrête le service une fois qu’il termine sa tache stopSelf();
}
}).start();
return START_STICKY;
}
Figure 7 Capture et résultat du lancement du service
Conclusion
Cette activité aborde les Services Android qui permettent de créer des applications qui font des tâches de fond.
Évaluation
Questions :
1. Expliquez la notion de service sous Android et son utilité.
2. Quels sont les deux types de services sous Android et quelles sont leur différences ?
3. Quelle(s) classe(s) est la base des services Android 4. Quelles sont les fonctions pour lancer/arrêter un service
5. Quels sont les callback de cette classe qu’il faut implémenter pour créer un service
6. Quand est ce que la méthode onStartCommand est-elle appelée ? 7. Quand est ce que le callback onBind est appelé ?
Exercice 1 : Création de service
En utilisant, Android Studio, Testez l’application suivante : Code C
MainActivity.java
package org.uva.myservice;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.content.Intent;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//gestion de la click du bouton demarrer
findViewById(R.id.buttonLancerService).setOnClickListener(new View.
OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MyServiceCompter.class);
startService(intent);
} });
//gestion du click du bouton arreter
findViewById(R.id.buttonArret).setOnClickListener(new View.
OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.
xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true;
public class MyServiceCompter extends Service { private static final String TAG = “CompteurService”;
private boolean isRunning = false;
public MyServiceCompter() { }
@Override
public void onCreate() { }
@Override
public int onStartCommand(Intent intent, int flags, int startId) { //Creation d’un nouveau Thread pour le service
//Toujours écrire vos tâches de longue durée dans un thread séparé, afin d’éviter l’erreur ANR
new Thread(new Runnable() {
@Override
public void run() {
//La logique du service est écrite ici for (int i = 0; i <5; i++) {
//Arrête le service une fois qu’il termine sa tache stopSelf();
public IBinder onBind(Intent intent) {
// Retourne null si ce n’est pas un service de type Bind return null;
}
@Override
public void onDestroy() {
} }
activity_main.xml
AndroidManifest.xml
<?xml version=”1.0” encoding=”utf-8”?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
Exercice 2 : Service de rappel
Modifiez le code de l’exercice précéèdent pour créer un service qui fait vibrer le téléphone tous les 10mn jusqu’à ce qu’on l’arrête en cliquant sur un bouton. (Voir la classe Vibrator).
Exercice 3 : Service bound (challenge)
Réalisez l’exercice 2 en utilisant un service bound et en vous aidant de la documentation officielle.
Activité 3.2 – Géolocalisation, et Services basés sur la localisation
Introduction
L’intégration de capteur GPS dans les appareils mobiles modernes est un vrai avancement dans l’interaction des utilisateurs avec leurs appareils mobiles.
Cette activité abord les concepts suivants :
• principe de la géolocalisation ;
• services de géolocalisation Android et fournisseurs ;
• utilisation du service de proximité ;
• Création d’activités avec des cartes.