• Aucun résultat trouvé

Implémentation d’un service

Dans le document Applications Mobiles (Page 152-163)

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.

Dans le document Applications Mobiles (Page 152-163)

Documents relatifs