You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ongoing设为true时,如何获取MediaStyle通知被取消的回调?

问题分析与解决方案

问题根源

  1. 重复设置不可清除标记:你同时使用setOngoing(true)和手动设置Notification.FLAG_NO_CLEAR,这两个标记都会让通知处于「不可被用户随意清除」的状态,导致滑动删除时系统直接忽略deleteIntent的触发逻辑。
  2. MediaStyle通知的事件绑定逻辑偏差:使用MediaStyle的通知会将生命周期控制权绑定到MediaSession,滑动删除这类操作的事件不会通过deleteIntent传递,而是由MediaSession.Callback统一处理。

修复步骤

  1. 移除冗余的FLAG_NO_CLEAR设置
    删除这行冲突代码:

    notification.flags = Notification.FLAG_NO_CLEAR
    

    setOngoing(true)已经足够将标记为正在进行中的通知,无需额外添加旧版的FLAG_NO_CLEAR标记。

  2. 通过MediaSession.Callback处理滑动删除事件
    你的通知已绑定MediaSession,当用户滑动删除ongoing状态的MediaStyle通知时,系统会触发MediaSession.Callback中的onStop()或onSessionDestroy()方法,在这些方法内处理你的业务逻辑即可。示例代码如下:

    val mediaSession = MediaSessionCompat(this, "AudioSession")
    mediaSession.setCallback(object : MediaSessionCompat.Callback() {
        override fun onStop() {
            super.onStop()
            // 在这里执行滑动删除后的逻辑,比如发送目标广播
            sendBroadcast(Intent("abc"))
            // 主动取消通知完成收尾
            (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).cancel(34)
        }
    
        override fun onSessionDestroy() {
            super.onSessionDestroy()
            // 也可在此处理会话销毁时的逻辑
            sendBroadcast(Intent("abc"))
        }
    })
    
  3. 保留通知内取消按钮逻辑(可选)
    你当前设置的setCancelButtonIntent仅作用于通知上的取消按钮,和滑动删除的逻辑互不冲突,可根据需求保留。

修改完成后,当setOngoing(true)时,用户滑动删除通知会触发MediaSession.Callback的对应方法,执行你需要的事件逻辑。

内容的提问来源于stack exchange,提问作者Diken Mhrz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:15:26