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
相关产品推荐
相关产品推荐

