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