Android通知图标无法隐藏问题求助:图标始终显示在通知栏
问题排查与修复方案
嘿,我帮你找到了通知无法取消的核心原因!
你在构建通知的时候调用了setOngoing(true)——这个方法会把通知标记为正在进行中的通知,这类通知是系统专门给“持续运行的任务”(比如音乐播放、后台下载)设计的,特性就是:用户没法手动划掉它,而且直接调用cancel()方法也不会生效,系统会默认保留这类通知直到你主动修改它的状态。
具体修复方式
分两种情况给你解决方案:
情况1:不需要这个通知是“持续进行”状态
直接删掉setOngoing(true)这一行,或者把它改成setOngoing(false)。这样修改后,你调用mNotifyManager.cancel(mNotifyId)就能正常移除通知了。
情况2:确实需要先显示ongoing通知,之后再取消
那你得先把通知的ongoing状态改成false,重新发送一次通知,再调用cancel才行。比如把你的Runnable改成这样:
final Runnable r = new Runnable() { public void run() { // 发送持续进行的通知 mBuilder.setOngoing(true); mNotifyManager.notify(mNotifyId, mBuilder.build()); // 模拟通知显示一段时间后取消(这里设了500毫秒,你可以按需调整) handler.postDelayed(() -> { // 先将通知改为非持续状态 mBuilder.setOngoing(false); mNotifyManager.notify(mNotifyId, mBuilder.build()); // 现在可以正常取消通知了 mNotifyManager.cancel(mNotifyId); }, 500); handler.postDelayed(this, 1000); } };
另外提个小细节:你现在的代码是发送通知后立刻调用cancel,就算没有ongoing的问题,用户也几乎看不到通知就没了,加个合理的延迟更符合实际使用场景~
还有,setAutoCancel(false)只是控制点击通知后是否自动取消,和调用cancel()方法无关,这个设置是没问题的;而且你用的通知ID是一致的,这部分也没毛病。
内容的提问来源于stack exchange,提问作者swing




