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

Android Studio Kotlin中切换页面或切后台时如何自动停止音乐播放

解决方案

你的问题根因为音频播放逻辑完全托管在DetailActivity的MediaPlayer实例中,没有关联Activity的生命周期回调,所以页面不可见/退后台时MediaPlayer仍然持有资源持续播放。按以下步骤修改即可覆盖所有要求的停止场景:

步骤1:抽取音频停止释放公共方法

在DetailActivity中抽取统一的停止释放逻辑,避免代码冗余:

private fun stopAndReleaseMediaPlayer() {
    mediaPlayer?.let { player ->
        if (player.isPlaying) {
            player.stop()
        }
        player.reset()
        player.release()
        mediaPlayer = null
        // 同步更新按钮状态
        findViewById<Button>(R.id.btnPlay).isEnabled = true
        findViewById<Button>(R.id.btnStop).isEnabled = false
        Toast.makeText(applicationContext,"音频已停止",Toast.LENGTH_SHORT).show()
    }
}

修改原有停止按钮的点击逻辑,直接调用该方法即可:

btnStop.setOnClickListener {
    stopAndReleaseMediaPlayer()
}

步骤2:绑定Activity生命周期回调

重写DetailActivity的onPause和onDestroy方法,只要页面不可见就自动停止音频,覆盖切回Fragment、切换应用内页面、切到其他应用三类场景:

override fun onPause() {
    super.onPause()
    stopAndReleaseMediaPlayer()
}

override fun onDestroy() {
    super.onDestroy()
    stopAndReleaseMediaPlayer()
}

步骤3:修复原有播放完成监听不生效问题

你原有代码的setOnCompletionListener在onCreate中调用时mediaPlayer还未初始化,监听不会生效,需要移动到mediaPlayer创建完成的位置:

btnPlay.setOnClickListener {
    if (mediaPlayer == null) {
        mediaPlayer = MediaPlayer.create(this@DetailActivity, Uri.parse(classAudio))
        mediaPlayer!!.isLooping = true
        // 在这里设置播放完成监听
        mediaPlayer!!.setOnCompletionListener {
            stopAndReleaseMediaPlayer()
            Toast.makeText(this@DetailActivity,"播放结束",Toast.LENGTH_SHORT).show()
        }
        mediaPlayer!!.start()
        btnStop.isEnabled = true
        btnPlay.isEnabled = false
        Toast.makeText(applicationContext,"音频开始播放",Toast.LENGTH_SHORT).show()
    } else {
        mediaPlayer!!.start()
    }
}

可选优化

你ClassFragment中声明的mediaPlayer变量从未使用,可以直接删除,避免后续逻辑混淆。如果后续需要支持后台播放能力,可改为使用前台Service托管MediaPlayer,同时申请音频焦点适配系统音频路由规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:24:02