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

Android主启动Activity播放音频出现一秒后中断问题如何解决?

问题根因

音频截断的核心原因是MediaPlayer实例被声明为onCreate方法内的局部变量:

  • onCreate执行完成后,局部变量mp无任何强引用持有,系统触发垃圾回收(GC)时该MediaPlayer实例会被直接回收销毁,播放逻辑随之终止,就出现了1秒左右截断的现象。
  • 第二个Activity播放正常,是因为该页面运行期间没有触发即时GC,或者你在第二个页面的MediaPlayer持有引用的时间更长,才没有复现问题。

修复方案

  1. 将MediaPlayer改为Activity的成员变量,保证实例在Activity生命周期内被强引用持有,不会被GC意外回收
  2. 补充MediaPlayer的生命周期管理,页面销毁时主动释放资源,避免内存泄漏

修复后代码示例

package com.mjr.testsound

import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    // 声明为类成员变量
    private var mediaPlayer: MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (savedInstanceState == null) {
            mediaPlayer = MediaPlayer.create(applicationContext, R.raw.guitar3)
            mediaPlayer?.start()
        }

        setContentView(R.layout.activity_main)
    }

    override fun onStop() {
        super.onStop()
        // 页面不可见时主动释放资源
        mediaPlayer?.apply {
            stop()
            release()
        }
        mediaPlayer = null
    }
}

额外排查点

如果修改后依然有截断问题,可检查主启动Activity的配置:

  • 是否在AndroidManifest.xml中给该Activity设置了android:noHistory="true"属性
  • 是否在onCreate/onStart阶段执行了跳转到其他Activity的逻辑,导致实例提前被销毁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:24:03