mardi 29 novembre 2011

Tutorial Android : Lancer un service au boot d'AndroId

Il est tout à fait possible dans Android de lancer une application au démarrage du système d'exploitation, sans fenêtre graphique (sans activité), sans icône de démarrage, uniquement en tâche de fond : il s'agit d'un service.

Le tutorial suivant vous propose un petit programme uniquement constitué de deux composants Android, sans aucune interface graphique :

- 1 service (il sera notre tâche de fond)
- 1 "broadcast receiver". Celui-ci recevra un "intent" nous avertissant que le démarrage du système est terminé. Il lancera ensuite le service.

Remarque : Ici on utilise le sdk Android 2.2.

Voici les différentes étapes pour créer un tel programme :

1. Créez un projet Android sans activité graphique :

Ne pas sélectionner la création d'une activité




















2. Créez une classe service comme ci-dessous :


public class MonService extends Service {

@Override
public void onDestroy() {
Log.v( "LTM","onDestroy" );
super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v( "LTM","onStartCommand" );
return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind( Intent arg0 ) {
Log.v( "LTM","onBind" );
return null;
}
}



3. Créez une classe "receiver" comme ci-dessous :


public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive( Context ctx, Intent i ) {
Log.v( "LTM", "MyReceiver.onReceive : " + i.getAction() );
Intent intent = new Intent( ctx, MonService.class );
ctx.startService(intent);
}
}


4. Mettre à jour le fichier manifeste : il vous faut évidemment indiquer les 2 composants crées dans le fichier manifeste : le service et le receiver.
Il est nécessaire également d'intégrer la permission ci-dessous.



<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ltm.service"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service android:label="Mon beau service à moi" 
            android:name="MonService"
android:exported="false">
        service>
        <receiver
            android:name="MyReceiver">
<intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
            intent-filter>
         receiver>
    application>
manifest>



5. Il ne vous reste plus qu'à compiler votre application et de la tester sur un périphérique.

Explications :
Notre application va recevoir l'intent 'BOOT_COMPLETED" via le receiver. Une fois cet événement reçu ce dernier lancera le service.

Et voilà, le tour est jouer !

A vous maintenant de jouer !

3 commentaires:

  1. Bonjour. Le sujet est intéressant, mais j'aurais été intéressé pour avoir plus d'explications sur les différents "class" SDK appelées lors de ce petit programme ... (ex.:LogV, getAction ...)

    Merci, bonne journée.

    RépondreSupprimer
  2. La classe Log est une classe java permettant de mettre des traces dans une application Android. Dans Eclipse il y a une fenêtre disponible pour suivre ces traces.
    Log.v veut dire verbose (v pour verbose)

    getAction() est une méthode de la classe Intent qui permet de recevoir l'action correspondant à un intent donné, ici : "android.intent.action.BOOT_COMPLETED"

    RépondreSupprimer
  3. ecoute j'ai tout fait comme indiqué mais le service ne se lance pas j'ai rien dans le logcat, mais alors rien du tout lol
    si tu pouvais m'aider
    merci

    RépondreSupprimer