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

Android多按钮音频互停实现:点击新按钮停止当前播放音频

解决方案与实现代码

第一步:声明全局MediaPlayer实例

在你的QuranJ30MA类中,添加一个全局的MediaPlayer变量,用来追踪当前正在播放的音频:

private MediaPlayer currentPlayer;

第二步:统一按钮点击逻辑

把所有按钮的点击方法修改为以下结构,每个方法只需要替换对应的音频资源ID即可:

public void Button1Text(View view) {
    // 停止当前播放的音频
    stopCurrentAudio();
    // 创建新的播放器并启动
    currentPlayer = MediaPlayer.create(this, R.raw.hannaba);
    currentPlayer.start();
}

public void Button1Text2(View view) {
    stopCurrentAudio();
    currentPlayer = MediaPlayer.create(this, R.raw.mannaba);
    currentPlayer.start();
}

// 其余按钮方法以此类推,替换R.raw.xxx为对应资源

第三步:添加停止当前音频的辅助方法

封装停止和释放资源的逻辑,避免重复代码:

private void stopCurrentAudio() {
    // 检查是否有正在播放的音频
    if (currentPlayer != null && currentPlayer.isPlaying()) {
        currentPlayer.stop();       // 停止播放
        currentPlayer.release();     // 释放系统资源
        currentPlayer = null;        // 将实例置空,避免后续空指针
    }
}

第四步:页面销毁时清理资源

在Activity的onDestroy方法中添加清理逻辑,防止内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    stopCurrentAudio();
}

原理讲解

  1. 全局实例统一管理:用一个全局的currentPlayer代替原来每个按钮方法里的局部播放器变量,让所有按钮都能操作同一个播放实例,实现“点击新按钮就停旧音频”的核心逻辑。
  2. 先停后播的原子操作:每次点击新按钮时,先执行stopCurrentAudio():
    • 先判断当前播放器是否存在且正在播放,避免空指针或无效操作;
    • 调用stop()终止播放,release()释放MediaPlayer占用的音频硬件资源(不释放会导致系统资源浪费甚至崩溃);
    • 将currentPlayer置空,确保下次创建新实例时不会冲突。
  3. 生命周期收尾:在Activity销毁时调用停止方法,确保退出页面时所有音频资源都被正确释放,避免内存泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:11