15

Android:安装软件包后,我试图取消通知栏中的通知。我正在做的是以下内容:

public class MyBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "MyBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
            Uri data = intent.getData();
            //some code goes here
            //get the id of the notification to cancel in some way
            notificationhelper._completeNotificationManager.cancel(id);     
        }
    }
}

在哪里

public class notificationhelper {
    public static NotificationManager _completeNotificationManager = null;

    public void complete() {        
        if (_completeNotificationManager == null)
            _completeNotificationManager = (NotificationManager) _context.getSystemService(Context.NOTIFICATION_SERVICE);
            
        Notification notification = new Notification(
            R.drawable.notification,
            _context.getString(R.string.notification),
            System.currentTimeMillis());
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.flags |= Notification.FLAG_NO_CLEAR;
        _completeNotificationManager.notify(TEXT, id, notification);
    }
}

notificationhelper._completeNotificationManager.cancel(id)不起作用。我尝试使用notificationhelper._completeNotificationManager.cancelAll();并且它有效。我做错了什么?

4

6 回答 6

28

根据我的经验,无论标签如何,您都无法取消具有特定 ID 的所有通知。

也就是说,如果您像这样创建两个通知:

notificationManager.notify(TAG_ONE, SAME_ID, notification_one);
notificationManager.notify(TAG_TWO, SAME_ID, notification_two);

然后,notificationManager.cancel(SAME_ID)不会取消其中任何一个!我怀疑这是因为“标签”字段,如果在 notify() 和 cancel() 中未指定,则默认为 null,您必须明确取消。

因此,要取消这两个通知,您必须调用:

notificationManager.cancel(TAG_ONE, SAME_ID);
notificationManager.cancel(TAG_TWO, SAME_ID);

在您的情况下,您提供“TEXT”作为标签,但仅使用 id 取消,默认使用 tag=null。

所以,要么不提供 TEXT 作为你的标签:

_completeNotificationManager.notify(id, notification);

或者,如果您需要单独的通知并且不希望它们相互干扰,请跟踪活动标签:

_completeNotificationManager.notify(TEXT, id, notification);
collectionOfActiveTags.add(TEXT);

...

for (String activeTag : collectionOfActiveTags)    
    notificationhelper._completeNotificationManager.cancel(activeTag, id);

我希望您尝试做的事情得到支持,因为它似乎应该如此。

于 2013-11-15T17:45:01.537 回答
10

好吧,这在这一点上可能无关紧要,但应该在这里发布,以便像我这样处理相同问题的人可能会找到解决方案。

如果NotificationManager.cancel()不起作用,请尝试更改通知的 ID。

notificationManager.notify(NOTIFICATION_ID, notification);

当我NOTIFICATION_ID从 1 更改为 [RANDOM_NUMBER] 时,它神奇地开始工作。我假设 1 以某种方式保留,尽管任何文档中都没有注释......

当然,请确保您使用相同的 NOTIFICATION_ID 取消:

notificationManager.cancel(NOTIFICATION_ID);
于 2013-08-29T17:50:44.110 回答
8

我的通知没有被删除,因为我的服务是前台服务,而不是 StartService 启动的常规服务。

如果您的服务在前台,请调用stopForeground(true)而不是 stopself()。所以现在我的代码如下所示:

NotificationManagerCompat.from(this).cancel(NotificationHelper.PLAYER_NOTIFICATION_ID);
stopForeground(true);

它起作用了,通知被删除了。

于 2018-02-20T10:03:24.963 回答
3

我最近面临同样的问题。我已经设法解决了。

所以据我了解。

  1. 使用基本上是随机数的 id 来通知并将相同的 id 发送到要取消它的代码段(接收器/活动......)。

  2. 使用标签时,它似乎对我不起作用,因为我为所有通知提供了一个标签,但具有唯一的 ID。它只适用于第一个标签,所以我完全避免使用标签。如果要使用标签,请发出唯一标签和唯一 ID,并在取消时同时使用它们。

所以最后的答案......我使用了什么,什么对我有用:

步骤1:

int notif_id = (int)(System.currentTimeMillis()%10000);

STEP2:在动作意图中添加这个ID(我正在启动一个活动,在动作点击时通知被取消):

Intent notificationSettingsIntent = new Intent(context.getApplicationContext(), NotificationSettingsActivity.class);
notificationSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
notificationSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
notificationSettingsIntent.putExtra("fromNotification",true);
notificationSettingsIntent.putExtra("notif_id",notif_id);
PendingIntent notificationSettingsActivityPendingIntent = PendingIntent.getActivity(context,notif_id,notificationSettingsIntent,PendingIntent.FLAG_ONE_SHOT);

第 3 步:使用第 1 步中的 id 进行通知,但没有标签

NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context.getApplicationContext());

notificationCompat.notify(notif_id,notificationBuilder.build());

现在在通过我的操作点击打开的活动中,我取消通知:

NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context.getApplicationContext());

notificationCompat.cancel(getIntent().getIntExtra("notif_id"));

现在每次都有效。

于 2017-05-07T19:07:22.007 回答
1

抱歉迟到了!但是以下对我来说效果很好。

NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(context.getApplicationContext());
mNotificationManager.cancel("<TAG>",<Notificatoin-id>);
于 2019-05-20T11:42:49.810 回答
0

以下为我工作:

final NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(context.getApplicationContext());
mNotificationManager.cancel(<Notificatoin-id>);
于 2018-06-04T08:47:25.063 回答