Developpez.com

Club des développeurs et IT pro
Plus de 4 millions de visiteurs uniques par mois

Les services sous Android

Image non disponible

Le but de ce tutoriel est d'expliquer succinctement le fonctionnement des services sous Android.
Commentez Donner une note à l'article (4.5)

Article lu   fois.

Les deux auteurs

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Présentation

Un service est une composante essentielle d'une application. Il est nécessaire lorsque votre application souhaite effectuer des opérations ou des calculs en dehors de l'interaction utilisateur. Donc comme vous l'aurez compris un service ne dispose pas d'interface graphique.

Rien de mieux qu'un exemple, votre lecteur de musique vous permet d'écouter la musique tout en surfant sur internet, lisant vos mails et cette fonctionnalité n'est possible qu'à l'aide des services.

Il existe deux types de services :

  • LocalService : services qui s'exécutent dans le même processus que votre application ;
  • RemoteService : ils s'exécutent dans des processus indépendants de votre application.

II. Cycle de vie d'un service

Un service n'a pas de durée définie, il est là pour exécuter sa tâche et il fonctionnera tant que c'est nécessaire. On va présenter les différentes méthodes qui correspondent au cycle de vie d'un service. Ces méthodes seront à surcharger quand vous créerez votre service :

  • OnCreate() : cette méthode est appelée à la création du service et est en général utilisée pour initialiser ce qui sera nécessaire à votre service ;
  • OnStart(Intent i) : le service démarre. Valable uniquement pour les versions du SDK inférieur à 2.0 ;
  • OnStartCommand(Intent i, int flags, int startId) : le service démarre. Valable uniquement pour les versions du SDK supérieur à 2.0 ;
  • OnDestroy() : appelé à la fermeture du service.
Image non disponible

III. Mon premier Service

Nous allons faire un exemple pour mieux comprendre, dans ce dernier nous allons créer un service qui affichera un toast contenant les coordonnées du téléphone. Le toast s'affichera quand les coordonnées seront mises à jour.

Nous allons créer un projet qui s'appellera MonPremierService, avec la version 2.1 du SDK.

  • Nom de l'application : MonPremierService
  • Package : com.tuto.android
  • Activité : HomeActivity

Dans notre classe HomeActivity, nous allons juste créer un bouton qui lancera le service quand on cliquera dessus.

Dans le fichier main.xml, on met le code suivant :

 
Sélectionnez

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/btn1"
    android:id="@+id/serviceBtn"
    />
</LinearLayout>

et voici le code à mettre dans l'activité correspondante

 
Sélectionnez

package com.tuto.android;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class HomeActivity extends Activity {
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button serviceBtn = (Button) findViewById(R.id.serviceBtn);
    serviceBtn.setOnClickListener( new OnClickListener()
    {
      @Override
      public void onClick(View actuelView)
      {
        startService(new Intent(HomeActivity.this, MonPremierService.class));
      }
    });
  }
}

Passons à notre service, pour le créer il suffit d'implémenter une classe qui hérite de la classe Service. Voici notre exemple :

 
Sélectionnez

package com.tuto.android;
 
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
 
public class MonPremierService extends Service
{
  private LocationManager locationMgr = null;
  private LocationListener onLocationChange = new LocationListener()
  {
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {
    }
 
    @Override
    public void onProviderEnabled(String provider)
    {
    }
 
    @Override
    public void onProviderDisabled(String provider)
    {
    }
 
    @Override
    public void onLocationChanged(Location location)
    {
      Double latitude = location.getLatitude();
      Double longitude = location.getLongitude();
 
      Toast.makeText(getBaseContext(),
      "Voici les coordonnées de votre téléphone : " + latitude + " " + longitude,
      Toast.LENGTH_LONG).show();
    }
  };
 
  @Override
  public IBinder onBind(Intent arg0)
  {
    return null;
  }
 
  @Override
  public void onCreate()
  {
    locationMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000,
    0, onLocationChange);
    locationMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0,
    onLocationChange);
    super.onCreate();
  }
 
  @Override
  public int onStartCommand(Intent intent, int flags, int startId)
  {
    return super.onStartCommand(intent, flags, startId);
  }
 
  @Override
  public void onDestroy()
  {
    super.onDestroy();
    locationMgr.removeUpdates(onLocationChange);
  }
}
  • Dans le OnCreate, On s'abonne au changement de géolocalisation, et dans le OnDestroy on se désabonne.
  • On crée une instance de la classe LocationListener, pour récupérer les nouvelles coordonnées.
  • Dans la méthode OnLocationChanged, on affiche les coordonnées à l'aide d'un Toast.
  • La méthode onBind sert quand on veut faire communiquer le service avec un autre service, ou avec une activité ...

Pour finir il faut déclarer le service dans le fichier AndroidManifest.xml, dans la partie Application

 
Sélectionnez

<service android:name="com.tuto.android.MonPremierService"/>

Sans oublier les permissions suivantes :

 
Sélectionnez

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.LOCATION" />

Ce qui donnera :

 
Sélectionnez

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tuto.android" android:versionCode="1" android:versionName="1.0">
 
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".HomeActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <service android:name="com.tuto.android.MonPremierService"/>
    </application>
 
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
    <uses-permission android:name="android.permission.LOCATION" />
 
</manifest>

Sans oublier le fichier strings.xml :

 
Sélectionnez

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="btn1">Lancer le service de géolocalisation</string>
    <string name="app_name">Mon Premier Service</string>
</resources>

IV. Résultat

Donc pour tester il suffit de :

  • lancer sur le projet ;
  • cliquer sur le bouton ;
  • mettre à jour les coordonnées de géolocalisation ;
  • un Toast devrait apparaitre avec les coordonnées de géolocalisation.

Voilà ce que vous devez obtenir :

Image non disponible

Sur l'image ci-dessous, on voit bien que le service est lancé (propriétés applications dans les paramètres du téléphone).

Image non disponible
Image non disponible

Voilà ce tutoriel se finit ici, en espérant qu'il vous a aidé à comprendre comment fonctionne les services sous Android.

V. Remerciements

Je tiens à remercier tout particulièrement Feanorin qui a mis ce tutoriel au format Developpez.com.
Merci également à ram-0000 d'avoir pris le temps de le relire et de le corriger.

VI. Liens

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2011 developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.