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

Android Activity失焦时停止音频及避免播放重叠问题求助

解决方案与问题解析

一、正确实现Activity前台播放、后台停止且避免音频重叠的代码

你之前的问题核心是MediaPlayer生命周期管理混乱,以及未正确初始化/释放资源导致的崩溃和重叠。以下是修正后的完整代码:

private MediaPlayer audio;

@Override
protected void onResume() {
    super.onResume();
    // 仅当MediaPlayer未初始化或已释放时,才创建新实例
    if (audio == null) {
        audio = MediaPlayer.create(this, R.raw.some_audio);
        // 如需循环播放可添加此行,不需要则删除
        // audio.setLooping(true);
    }
    // 确保音频未播放时再启动,避免重复触发
    if (!audio.isPlaying()) {
        audio.start();
    }
}

@Override
protected void onPause() {
    super.onPause();
    // 停止播放并释放资源,避免后台占用内存或报错
    if (audio != null && audio.isPlaying()) {
        audio.stop();
        audio.release();
        audio = null; // 置空,下次onResume重新创建
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // 销毁时确保资源完全释放
    if (audio != null) {
        audio.release();
        audio = null;
    }
}

关键说明:

  • 避免音频重叠:每次onResume仅在audio为null时创建新实例,同时通过isPlaying()判断再启动,防止重复触发播放。
  • 防止崩溃:在onPause/onDestroy中先判断audio是否为null,再执行停止和释放操作,避免空指针异常。
  • 资源释放:调用release()释放MediaPlayer占用的音频资源,避免内存泄漏或影响其他音频播放。

二、你之前代码的问题分析

  1. 第二次修改后崩溃的原因
    你去掉了onResume里的audio = MediaPlayer.create(...),导致全局变量audio始终为null,调用audio.start()或audio.stop()时触发空指针异常,堆栈信息提到的MediaPlayer.create()是误解,实际是空指针导致的崩溃。

  2. 添加判断后无效的原因
    你每次onResume都重新创建MediaPlayer实例,新创建的实例默认处于未播放状态,!audio.isPlaying()永远为true,因此每次都会启动新的音频,导致重叠。

三、全局作用域声明MediaPlayer.create(this, ...)报错的原因

在Activity的全局变量初始化阶段,Activity的Context还未完成初始化,此时this指向的Activity对象还未被系统完全创建,MediaPlayer.create()需要有效的Context来加载资源,因此会抛出异常。

所有依赖Context的组件(如MediaPlayer、LayoutInflater等),都应该在Activity的生命周期方法(如onCreate、onResume)中初始化,而非全局变量声明时直接初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:54:28