点击操作后关闭当前通知

10

我有一个带操作按钮的自定义通知:

public class NotificationReceiver extends com.parse.ParsePushBroadcastReceiver {
    @Override
    public void onPushReceive(Context context, Intent intent) {

    ...

    NotificationActivity notification = new NotificationActivity();
    notification.createNotification(context, message, notificationId);

    Log.i("tag", "Notification Received!");
}

public class NotificationActivity {

    public int notificationId;

    public void createNotification(Context context, String message, String studentId, String notificationId){
         this.notificationId = Integer.parseInt(notificationId);

         // manager
         NotificationManager notificationManager = 
         (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

         // notification
         Notification.Builder mBuilder = new Notification.Builder(context);
         mBuilder.setContentTitle("My Title");
         mBuilder.setContentText(message);
         mBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
         mBuilder.setAutoCancel(true);
         mBuilder.setStyle(new Notification.BigTextStyle()
             .bigText(message));

         // cancel intent
         Intent cancelIntent = new Intent(context, CancelNotification.class);
         Bundle extras = new Bundle();
         extras.putInt("notification_id", this.notificationId);
         cancelIntent.putExtras(extras);
         PendingIntent pendingCancelIntent = 
             PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ;
         mBuilder.addAction(R.drawable.notification_close, "Fechar", pendingCancelIntent);

        // notify
        Notification notification = mBuilder.build();
        notificationManager.notify(Integer.parseInt(notificationId), notification);
    }

    public static class CancelNotification extends BroadcastReceiver {

        private int id;

        @Override
        public void onReceive(Context context, Intent intent) {
             id = intent.getIntExtra("notification_id", 1);
             NotificationManager notificationManager =
                  (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
             notificationManager.cancel(id);
        }
    }
}

我想取消我点击"关闭"操作按钮的通知。

我知道我需要通知的id来取消它,但是当我点击"关闭"按钮并创建继承BroadCastReceiver的CancelNotification类时,我的代码方式是获取最后一个通知的ID,即使我点击了我创建的第一个通知,也会关闭最后一个通知。

我可能做错了什么?


你尝试过添加Notification.FLAG_AUTO_CANCEL吗?这个标志是否具有你期望的行为? - guipivoto
我已经更新了通知构建器中的所有内容。现在,当我点击“关闭”按钮时,它什么也不做。 - Ravers
当您点击这些按钮时,意图将被广播到系统。也许,您需要处理这个意图。尝试这个答案:https://dev59.com/qHLYa4cB1Zd3GeqPb800 - guipivoto
@GuilhermeP 我编辑了我的问题,如果你能的话,请再看一下。 - Ravers
3个回答

11

我找到它了

你的pendingIntent总是发送请求码== 0;

由于您有多个通知,因此每个通知都应该使用不同的requestCode。

所以,请尝试更改:

从:

I found it

PendingIntent pendingCancelIntent = 
         PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ;

收件人:

PendingIntent pendingCancelIntent = 
         PendingIntent.getBroadcast(context, this.notificationId, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ;

我在这里测试了你的代码,经过我所做的更改后,它正在运行。


我也不知道哈哈哈。在我的测试中,我不小心插入了ID而不是 “0” ,结果它竟然起作用了。在调查原因时,我注意到了这个区别,就这样!! 最好的问候。 - guipivoto
但是...如果使用"id = intent.getIntExtra("notification_id", 1);"检索通知ID,为什么您建议的更改(即参数更改)会使其正常工作? - Marco Zanetti
这个问题发生在意图创建期间。意图总是使用ID = 0创建。因此,getIntExtra(“notification_id”,1)始终返回0,然后只有最后一个接收到的通知被取消(即使单击第一个通知)。 - guipivoto

3

始终最好使用通知生成器。 以下是一个示例:

    NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(this);
    mBuilder.setContentTitle("Your title");
    mBuilder.setOnlyAlertOnce(true);
    mBuilder.setAutoCancel(true);
    mBuilder.setContentText("main content")
    mBuilder.setSubText("subtext")

接下来,您需要创建一个意图,以指定您希望在通知被点击时打开哪个活动。
    intent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

然后创建您的通知管理器

    notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    Notification notification = mBuilder.build();
    notification.flags = Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(notificationID, notification);

notificationID 可以是任何整数值。使用这种类型的好处是始终遵循 Android 通知的规范。


很酷,但是在BroadcastReceiver中如何检索通知ID以确保取消正确的通知? - Marco Zanetti

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接