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()再次调用并将新通知传递给它,所以我的服务仍然存在。

4

3 回答 3

13

问题是您使用startForeground(). 您不能仅仅因为系统坚持要求您在启动前台服务时提供通知而取消该通知。只要您的前台服务正在运行,该通知就会在那里。

在大多数情况下,服务确实不应该在前台。如果您可以为您的服务使用正常的优先级,那么您可以正常启动和停止您的通知。

如果您实际上正在做一些确实需要前台服务的事情,并且如果您真的想向用户显示代码文本,我相信您唯一的选择是发出另一个通知。

于 2012-07-08T23:19:48.597 回答
7

您始终可以通过调用 stopForeground(boolean removeNotification) 从前台服务中删除通知。然后一个服务退出他的foregroundState,并在需要内存时再次被系统杀死。

于 2014-02-21T05:48:50.750 回答
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;
}
于 2015-08-17T17:22:07.893 回答