【问题标题】:Dismiss current notification on Action clicked关闭点击操作的当前通知
【发布时间】:2016-05-16 03:48:47
【问题描述】:

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

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?此标志是否具有您所期望的行为?
  • 我用我在 notification.builder 中的所有内容更新了这个问题。现在当我点击“关闭”按钮时,它什么也不做。
  • 当你点击这些按钮时,意图被广播到系统。也许,您需要处理意图.. 试试这个 asnwer:stackoverflow.com/q/16869777/4860513
  • @GuilhermeP 我编辑了我的问题,如果可以,请再看一遍

标签: java android push-notification


【解决方案1】:

在您的意图被触发后,您需要运行以下代码来移除通知。

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

https://stackoverflow.com/a/61483371/7308789

【讨论】:

    【解决方案2】:

    找到了

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

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

    所以,尝试改变:

    发件人:

    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”,它正在工作。在检查原因时,我注意到了差异,瞧!最好的问候
    • 但是...如果使用“id = intent.getIntExtra("notification_id", 1);" 检索到通知 ID为什么您建议的更改(即参数更改)会使其起作用?
    • 这个问题的问题是在意图创建期间发生的。 Intent 总是使用 ID=0 创建的。因此,getIntExtra("notification_id", 1) 总是返回 0,然后,只有收到的最后一个通知被取消(即使点击第一个通知)...
    【解决方案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 以确保取消正确的通知?
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多