Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

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 
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();

        Resources res = context.getResources();
        Notification.Builder builder = new Notification.Builder(context);
        builder.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 );
    }
}
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 
 37 
<?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" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <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
la technique de lancement de notification proposée fonctionne sur la majorité des périphériques Android (du moins en 2019). Pour autant, Android Oreo (API 26) a changé la manière d'emettre une notification en rajoutant notamment le concept de NotificationChannel. En conséquence, le code présenté ci-dessus ne marche plus à partir de cette version de l'API Android. Le code moderne d'emission de notification vous est proposé sur ce tutoriel : Déclenchement de notifications. Veuillez adapter le code si vous êtes dans ce cas (y compris si votre paramètre Graddle targetMinSdk est fixé à la valeur 26 ou supérieur).