You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动