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

Android跳转新Activity后实现页面加载完成再播放音频的咨询

解决方案:让音频在Activity页面加载完成后播放

你遇到的问题其实是因为在Activity初始化阶段(比如onCreate方法里)就启动了MediaPlayer,这时候页面布局还没完成渲染,所以音频会先于页面显示出来。要实现页面加载完成后再播放,只需要找准布局加载完成的时机即可,下面给你两种常用的方法:

方法一:利用Activity的onWindowFocusChanged方法

这个方法会在Activity的窗口获得焦点时被调用,这时候页面已经完全显示出来了。你可以把播放音频的逻辑放在这里:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        // 页面已经加载完成且获得焦点,开始播放音频
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.audio);
        mp.start();
        // 记得在播放完成后释放MediaPlayer资源,避免内存泄漏
        mp.setOnCompletionListener(mediaPlayer -> mediaPlayer.release());
    }
}

不过要注意,当Activity焦点发生变化(比如弹出对话框后返回),这个方法会再次触发,如果你不想重复播放,可以加一个布尔标记位来控制播放逻辑。

方法二:通过ViewTreeObserver监听布局加载完成

如果你想更精准地监听布局绘制完成的时刻,可以用ViewTreeObserver监听根布局的加载状态,这种方法不会受焦点变化的影响:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout); // 替换成你的实际布局文件

    // 获取Activity的根布局
    View rootView = findViewById(android.R.id.content);
    ViewTreeObserver observer = rootView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // 布局加载完成后,先移除监听避免重复触发
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
            // 开始播放音频
            final MediaPlayer mp = MediaPlayer.create(YourActivity.this, R.raw.audio);
            mp.start();
            mp.setOnCompletionListener(mediaPlayer -> mediaPlayer.release());
        }
    });
}

这种方法会在布局的所有子View都绘制完成后触发,是比较精准的页面加载完成时机。

另外提醒一下,MediaPlayer属于消耗资源的组件,使用完后一定要记得释放资源,上面的代码里通过setOnCompletionListener在播放完成后自动释放,你也可以在Activity的onDestroy方法里手动处理资源释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:08:49