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.
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 ); } } |
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> |
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).
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 :