web-dev-qa-db-fra.com

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

Depuis le niveau 16 de l’API (haricot jelly), il est possible d’ajouter des actions à une notification avec

builder.addAction(iconId, title, intent);

Mais lorsque j'ajoute une action à une notification et que l'action est activé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 allusions? Ou est-ce que cela ne fait pas encore partie de l'API? J'ai rien trouvé.

129
endowzoner

Lorsque vous avez appelé notify sur le gestionnaire de notifications, vous lui avez attribué un identifiant. C'est l'identifiant unique que vous pouvez utiliser pour y accéder ultérieurement (à partir du gestionnaire de notifications:

notify(int id, Notification notification)

Pour annuler, vous appelez:

cancel(int id)

avec le même identifiant. Donc, fondamentalement, vous devez garder une trace de l'ID ou éventuellement l'insérer dans un Bundle que vous ajoutez à l'intention dans PendingIntent?

140
Kaediil

Problème rencontré lors de l'utilisation de la notification Heads Up Display de Lollipop. Voir directives de conception . Voici le code (ish) complet à implémenter.

Jusqu'à présent, avoir un bouton "Dismiss" était moins important, mais maintenant, il est plus présent.

heads up notification

Construction de 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 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 requis pour empêcher SystemUI de se focaliser sur une pile arrière)

<activity
    Android:name=".NotificationActivity"
    Android:taskAffinity=""
    Android:excludeFromRecents="true">
</activity>
61
aaronvargas

J'ai constaté que lorsque vous utilisez les boutons d'action dans les notifications développées, 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 automatiquement annulée que pour l'action par défaut.

De même, si vous démarrez un récepteur de radiodiffusion à 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 interface utilisateur annule la notification, puis démarre l'activité que je voulais vraiment démarrer à partir de la notification.

J'ai posté un exemple de code dans un article lié en cliquant sur Android les actions de notification ne ferment pas le tiroir de notification .

16
Vicki

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

Dans AndroidManifest.xml:

<receiver 
    Android:name=.NotificationCancelReceiver" >
    <intent-filter Android:priority="999" >
         <action Android:name="com.example.cancel" />
    </intent-filter>
</receiver>

Dans Java Fichier:

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
    };
}
6

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

5
CommonsWare

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

notify(String tag, int id, Notification notification)

et en conséquence

cancel(String tag, int id) 

au lieu de:

cancel(int id)

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

3
Malachiasz

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