Android Notifications de planification


Exemple

Parfois, il est nécessaire d'afficher une notification à un moment précis, une tâche qui n'est malheureusement pas triviale sur le système Android, car il n'y a pas de méthode setTime() ou similaire pour les notifications. Cet exemple décrit les étapes nécessaires pour planifier des notifications à l'aide du AlarmManager :

  1. Ajoutez un BroadcastReceiver qui écoute les Intent diffusées par le AlarmManager Android.

C'est l'endroit où vous créez votre notification en fonction des extras fournis avec l' Intent :

   public class NotificationReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context context, Intent intent) {
           // Build notification based on Intent
           Notification notification = new NotificationCompat.Builder(context)
               .setSmallIcon(R.drawable.ic_notification_small_icon)
               .setContentTitle(intent.getStringExtra("title", ""))
               .setContentText(intent.getStringExtra("text", ""))
               .build();
           // Show notification
           NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
           manager.notify(42, notification);
       }
   }
  1. Enregistrez le BroadcastReceiver dans votre fichier AndroidManifest.xml (sinon, le récepteur ne recevra aucune Intent du AlarmManager ):

    <receiver
        android:name=".NotificationReceiver"
        android:enabled="true" />
    
  2. Planifier une notification en transmettant un PendingIntent pour votre BroadcastReceiver avec les extras Intent nécessaires au système AlarmManager . Votre BroadcastReceiver recevra l’ Intent une fois l’heure donnée et affichera la notification. La méthode suivante permet de planifier une notification:

    public static void scheduleNotification(Context context, long time, String title, String text) {
        Intent intent = new Intent(context, NotificationReceiver.class);
        intent.putExtra("title", title);
        intent.putExtra("text", text);
        PendingIntent pending = PendingIntent.getBroadcast(context, 42, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        // Schdedule notification
        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pending);
    }
    

    S'il vous plaît noter que le 42 ci-dessus doit être unique pour chaque notification planifiée, sinon les PendingIntent s se remplaceront mutuellement provoquant des effets indésirables!

  3. Annulez une notification en reconstruisant le PendingIntent associé et en l'annulant sur le AlarmManager du système. La méthode suivante annule une notification:

    public static void cancelNotification(Context context, String title, String text) {
        Intent intent = new Intent(context, NotificationReceiver.class);
        intent.putExtra("title", title);
        intent.putExtra("text", text);
        PendingIntent pending = PendingIntent.getBroadcast(context, 42, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        // Cancel notification
        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        manager.cancel(pending);
    }
    

Notez que le 42 ci-dessus doit correspondre au numéro de l'étape 3!