Comment rejeter la notification après avoir cliqué sur l’action

Depuis l’API niveau 16 (Jelly Bean), il est possible d’append des actions à une notification avec

builder.addAction(iconId, title, intent); 

Mais lorsque j’ajoute une action à une notification et que l’action est enfoncée, la notification ne sera pas rejetée. Lorsque la notification elle-même est cliquée, elle peut être rejetée avec

 notification.flags = Notification.FLAG_AUTO_CANCEL; 

ou

 builder.setAutoCancel(true); 

Mais évidemment, cela n’a rien à voir avec les actions associées à la notification.

Des indices? Ou est-ce que cela ne fait pas encore partie de l’API? J’ai rien trouvé.

Lorsque vous avez appelé notify sur le gestionnaire de notifications, vous lui avez donné un identifiant – c’est l’identifiant unique que vous pouvez utiliser pour y accéder ultérieurement (cela provient du gestionnaire de notifications:

 notify(int id, Notification notification) 

Pour annuler, vous appelez:

 cancel(int id) 

avec le même identifiant Donc, en gros, vous devez garder une trace de l’ID ou éventuellement placer l’ID dans un ensemble que vous ajoutez à l’intention dans l’élément PendingIntent?

Cela a été un problème lors de l’utilisation de la notification d’affichage tête haute de Lollipop. Voir les directives de conception . Voici le code complet (ish) à implémenter.

Jusqu’à présent, avoir un bouton ‘Dismiss’ était moins important, mais maintenant c’est plus sur votre visage.

notification tête haute

Construire la notification

 int notificationId = new Random().nextInt(); // just use a counter in some util class... PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission .setSmallIcon(R.drawable.ic_action_refresh) // Required! .setContentTitle("Message from test") .setContentText("message") .setAutoCancel(true) .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent) .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent); // Gets an instance of the NotificationManager service NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Builds the notification and issues it. notifyMgr.notify(notificationId, builder.build()); 

NotificationActivity

 public class NotificationActivity extends Activity { public static final Ssortingng NOTIFICATION_ID = "NOTIFICATION_ID"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } } 

AndroidManifest.xml (atsortingbuts requirejs pour empêcher SystemUI de se concentrer sur une stack arrière)

   

J’ai constaté que lorsque vous utilisez les boutons d’action dans les notifications étendues, vous devez écrire du code supplémentaire et vous êtes plus contraint.

Vous devez annuler manuellement votre notification lorsque l’utilisateur clique sur un bouton d’action. La notification n’est annulée automatiquement que pour l’action par défaut.

De même, si vous démarrez un récepteur de diffusion à partir du bouton, le tiroir de notification ne se ferme pas.

J’ai fini par créer une nouvelle NotificationActivity pour résoudre ces problèmes. Cette activité intermédiaire sans aucune interface utilisateur annule la notification et lance ensuite l’activité que je voulais vraiment démarrer à partir de la notification.

J’ai posté un exemple de code dans un article connexe Cliquer sur Actions de notification Android ne ferme pas le tiroir de notification .

Vous pouvez toujours cancel() la Notification de ce qui est invoqué par l’action (par exemple, dans onCreate() de l’activité liée à PendingIntent vous fournissez à addAction() ).

À mon avis, utiliser un BroadcastReceiver est un moyen plus propre d’annuler une notification:

Dans AndroidManifest.xml:

      

En java File:

 Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiver public class NotificationCancelReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; } 

Il suffit de mettre cette ligne:

  builder.setAutoCancel(true); 

Et le code complet est:

 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(android.R.drawable.ic_dialog_alert); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentIntent(pendingIntent); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic)); builder.setContentTitle("Notifications Title"); builder.setContentText("Your notification content here."); builder.setSubText("Tap to view the website."); Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); builder.setAutoCancel(true); // Will display the notification in the notification bar notificationManager.notify(1, builder.build());