178 votes

Comment rejeter une notification après avoir cliqué sur une action ?

Depuis le niveau 16 de l'API (Jelly Bean), il est possible d'ajouter des actions à une notification à l'aide de la fonction

builder.addAction(iconId, title, intent);

Mais lorsque j'ajoute une action à une notification et que l'on appuie sur l'action, la notification ne sera pas renvoyée. Lorsque l'on clique sur la notification elle-même, on peut la renvoyer 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 conseils ? Ou cela ne fait-il pas encore partie de l'API ? Je n'ai rien trouvé.

185voto

Kaediil Points 3049

Lorsque vous avez appelé notify sur le gestionnaire de notification, vous lui avez donné un id - c'est l'id unique que vous pouvez utiliser pour y accéder plus tard (ceci est à partir du gestionnaire de notification :

notify(int id, Notification notification)

Pour annuler, vous devez appeler :

cancel(int id)

avec le même identifiant. Donc, en gros, vous devez garder la trace de l'id ou éventuellement mettre l'id dans un Bundle que vous ajoutez à l'Intent à l'intérieur du PendingIntent ?

70voto

aaronvargas Points 1881

J'ai trouvé que c'était un problème lors de l'utilisation de la notification de l'affichage tête haute de Lollipop. Voir directives de conception . Voici le code complet (ou presque) à mettre en œuvre.

Jusqu'à présent, il était moins important de disposer d'un bouton "Rejeter", mais aujourd'hui, c'est plus évident.

heads up notification

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

NotificationActivité

public class NotificationActivity extends Activity {

    public static final String 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 (attributs nécessaires pour empêcher SystemUI de se concentrer sur une pile arrière)

<activity
    android:name=".NotificationActivity"
    android:taskAffinity=""
    android:excludeFromRecents="true">
</activity>

20voto

Vicki Points 101

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 lancez 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 lancer à partir de la notification.

J'ai posté un exemple de code dans un billet connexe. Cliquer sur les actions de notification d'Android ne ferme pas le tiroir de notification .

10voto

Malachiasz Points 1537

Dans les nouvelles API, n'oubliez pas le TAG :

notify(String tag, int id, Notification notification)

et par conséquent

cancel(String tag, int id) 

au lieu de :

cancel(int id)

https://developer.Android.com/reference/Android/app/NotificationManager

10voto

Houssin Boulla Points 219

Vous devrez exécuter le code suivant après le déclenchement de votre intention pour supprimer la notification.

NotificationManagerCompat.from(this).cancel(null, notificationId);

NB : notificationId est le même id passé pour lancer votre notification

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X