Rechercher
 

Démarrage d'un code au boot du système Android

Cet exemple montre comment déclencher un bout de code (un receiver) à la fin du boot du système Android. Cela peut notamment être utile pour démarrer un service Android au moment du boot.

Implémentation d'un receiver

Pour y arriver, vous devez en premier lieu implémenter un receiver en héritant de la classe android.content.BroadcastReceiver. Une méthode est à coder : onReceive. C'est elle qui recevra une intention associée à l'événement que vous souhaitez intercepter (içi, le boot du système : l'association entre l'événement et le receiver sera réalisé dans le fichier de manifest Android). Voici le code de notre receiver.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
package com.infinisoftware.bootreceiver;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.util.Log;
import android.widget.Toast;

public class BootReceiver extends BroadcastReceiver {

    private static final int INTENT_ID = 123;
    private static final int NOTIF_ID = 456;
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("BOOT", "Boot completed");
        
        Toast.makeText( context, "Boot completed", Toast.LENGTH_LONG ).show();

        NotificationManager notifManager = (NotificationManager)
                context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent notificationIntent = new Intent(context, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(
                context, INTENT_ID, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        Resources res = context.getResources();
        Notification.Builder builder = new Notification.Builder(context);
        builder.setContentIntent(contentIntent)
                .setSmallIcon(R.mipmap.ic_launcher)      // Mandatory
                .setLargeIcon(BitmapFactory.decodeResource(res, R.mipmap.ic_launcher))
                .setTicker("boot received")
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(true)
                .setContentTitle("A  notification title")
                .setContentText("boot received")
                .setVibrate(new long[]{ 0, 500, 110, 500, 110, 450, 110, 200, 110,
                                        170, 40, 450, 110, 200, 110, 170, 40, 500 } )
                .setLights(Color.RED, 3000, 3000);
        Notification notification = builder.getNotification();
        notifManager.notify( NOTIF_ID, notification );

        // --- Exemple de d?marrage d'un service Android ---
        //Intent serviceIntent = new Intent( context, MyService.class );
        //context.startService( serviceIntent );
    }
}
Classe d'implémentation de notre reveiver.

Déclaration de notre receiver et autorisations requises

Un receiver doit obligatoirement être déclaré dans le fichier de manifest de votre application Android. De plus cet exemple nécessite une autorisation utilisateur pour recevoir une intention associée au boot du système.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.infinisoftware.bootreceiver" >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity
            android:name=".MainActivity"
            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=".MyService"
            android:enabled="true" android:exported="true" >
        </service -->

    </application>

</manifest>
Le fichier AndroidManifest.xml