NotificationManager.cancel(id)在广播接收器内不起作用

时间:2012-10-25 06:27:00

标签: android broadcastreceiver notificationmanager

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();并且它有效。我做错了什么?

6 个答案:

答案 0 :(得分:21)

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

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

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

然后,notificationManager.cancel(SAME_ID)不会取消其中任何一个!我怀疑这是因为“tag”字段,如果在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);

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

答案 1 :(得分:10)

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

如果NotificationManager.cancel()无效,请尝试更改通知的ID。

notificationManager.notify(NOTIFICATION_ID, notification);

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

当然要确保使用相同的NOTIFICATION_ID取消:

notificationManager.cancel(NOTIFICATION_ID);

答案 2 :(得分:3)

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

如果您的服务是前台服务,请拨打stopForeground(true)而不是停止自己()。所以现在我的代码看起来像这样:

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

并且有效,通知已被删除。

答案 3 :(得分:2)

我最近遇到了同样的问题。我设法解决了它。

所以从我的理解。

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

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

所以最终答案......我用过什么,对我有用:

STEP 1:
int notif_id = (int)(System.currentTimeMillis()%10000);

STEP2: add this id inside the action intent (I am launching an activity where the notification gets cancelled on the action click):

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

STEP 3: notify using the id in the step 1 but with no tags

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

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

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

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

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

现在每次都有效。

答案 4 :(得分:1)

以下为我工作:

final NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(context.getApplicationContext());
mNotificationManager.cancel(<Notificatoin-id>);

答案 5 :(得分:0)

很抱歉迟到! 但是跟随对我来说很好。

NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(context.getApplicationContext());
mNotificationManager.cancel("<TAG>",<Notificatoin-id>);