Ongoing设为true时,如何获取MediaStyle通知被取消的回调?
问题分析与解决方案
问题根源
- 重复设置不可清除标记:你同时使用
setOngoing(true)和手动设置Notification.FLAG_NO_CLEAR,这两个标记都会让通知处于「不可被用户随意清除」的状态,导致滑动删除时系统直接忽略deleteIntent的触发逻辑。 - MediaStyle通知的事件绑定逻辑偏差:使用
MediaStyle的通知会将生命周期控制权绑定到MediaSession,滑动删除这类操作的事件不会通过deleteIntent传递,而是由MediaSession.Callback统一处理。
修复步骤
移除冗余的FLAG_NO_CLEAR设置
删除这行冲突代码:notification.flags = Notification.FLAG_NO_CLEARsetOngoing(true)已经足够将标记为正在进行中的通知,无需额外添加旧版的FLAG_NO_CLEAR标记。通过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")) } })保留通知内取消按钮逻辑(可选)
你当前设置的setCancelButtonIntent仅作用于通知上的取消按钮,和滑动删除的逻辑互不冲突,可根据需求保留。
修改完成后,当setOngoing(true)时,用户滑动删除通知会触发MediaSession.Callback的对应方法,执行你需要的事件逻辑。
内容的提问来源于stack exchange,提问作者Diken Mhrz
相关产品推荐
相关产品推荐

