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

Jetpack Media3:用户删除通知时停止MediaSessionService方案咨询

解决Media3中删除通知时停止MediaSessionService的简化方案

不用编写单独的BroadcastReceiver,直接通过PendingIntent调用MediaSessionService内部逻辑就能实现需求,步骤如下:

1. 在MediaSessionService中定义并处理停止服务的Action

在你的MediaSessionService子类里,先定义一个自定义Action常量,再在onStartCommand()中处理该Action:

class MyMediaSessionService : MediaSessionService() {
    companion object {
        const val ACTION_STOP_SERVICE = "com.your.package.ACTION_STOP_SERVICE"
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        intent?.let {
            if (it.action == ACTION_STOP_SERVICE) {
                // 停止前台状态并移除通知
                stopForeground(STOP_FOREGROUND_REMOVE)
                // 终止服务
                stopSelf()
            }
        }
        return super.onStartCommand(intent, flags, startId)
    }

    // 其他MediaSessionService相关逻辑(如初始化MediaSession等)...
}

2. 在MediaNotification.Provider中设置DeleteIntent

在自定义的MediaNotification.Provider的createNotification()方法里,构建指向上述Action的PendingIntent,然后设置为通知的DeleteIntent:

class MyMediaNotificationProvider(
    private val context: Context
) : MediaNotification.Provider {

    override fun createNotification(
        mediaSession: MediaSession,
        mediaItem: MediaItem?,
        playWhenReady: Boolean,
        playbackState: PlaybackState,
        customLayout: ImmutableList<CommandButton>?,
        actionFactory: MediaNotification.ActionFactory,
        onNotificationChangedCallback: MediaNotification.Provider.Callback?
    ): MediaNotification {
        val notificationBuilder = NotificationCompat.Builder(context, "your_notification_channel_id")
            // 设置通知基础属性(标题、图标、播放控制按钮等)...
            .setDeleteIntent(
                PendingIntent.getForegroundService(
                    context,
                    0,
                    Intent(context, MyMediaSessionService::class.java).apply {
                        action = MyMediaSessionService.ACTION_STOP_SERVICE
                    },
                    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
                )
            )

        return MediaNotification(1, notificationBuilder.build())
    }
}

方案优势

  • 无需额外注册BroadcastReceiver,减少组件复杂度
  • 逻辑集中在MediaSessionService内部,维护更便捷
  • 直接利用前台服务的PendingIntent机制,符合Android最新权限与行为规范

兼容提示:如果需要适配Android 11及以下版本,可将PendingIntent.getForegroundService()替换为PendingIntent.getService(),同时确保服务已在Manifest中正确声明为前台服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:33:22