NotificationManager.cancel()无效:通知未被移除。

7

我一直在尝试使用以下方法删除由服务设置的持久通知:

startForeground(1337, notification);

我正在使用的取消代码:

我正在使用的取消代码:

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nManager.cancel(1337);  // cancel existing service notification, doesn't take effect
nManager.cancelAll(); //surpluous, but also doesn't take effect

为了澄清为什么我这样做:服务从默认的持久通知开始。当我的应用程序运行时,它需要用另一个通知替换它。使用notify()现有通知上完美地工作,但是我需要它显示新通知的跑马灯文本。这就是为什么我决定删除现有通知(使用上面的代码),创建一个新通知,然后再次调用startForeground()并将新通知传递给它,以使我的服务持久存在。

你正在尝试删除来自不同应用程序启动的通知? - matt5784
不,这是同一个应用程序。 - slinden77
3个回答

13
问题在于您是通过使用 startForeground() 间接发出通知的。由于系统坚持要求在启动前台服务时提供通知,因此您不能仅仅取消该通知。只要您的前台服务正在运行,该通知就会一直存在。
在大多数情况下,服务确实不应处于前台。如果您可以为您的服务使用普通优先级,则可以正常启动和停止通知。
如果您实际上正在执行确实需要前台服务的操作,并且如果您真的想向用户显示跑马灯文本,则我认为您唯一的选择是发出另一个通知。

9
当尝试执行此操作时,他们应该将其放入文档中或使其抛出错误。 - slinden77

7

您可以调用stopForeground(boolean removeNotification)来随时从前台服务中删除通知。然后,服务退出其前台状态,并在需要内存时再次可能被系统杀死。


0

您可以通过传递一个空的Builder来更新通知。

if(showNotification){
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setVisibility(Notification.VISIBILITY_SECRET)
            .setSmallIcon(R.mipmap.ic_spotify_white_24dp)
            .setTicker("Playing Now")
            .setContentTitle("Spotify")
            .setContentText("Preview");
    return mBuilder;
}else{
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
    return mBuilder;
}

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