安卓开发如何实现跨Activity通用的MediaPlayer音乐启停控制函数?
解决方案
完全可以实现通用的全局音乐控制类,你当前的写法问题在于MediaPlayer是MainActivity里的局部变量,跳转页面后没有引用可以控制它停止,用单例模式封装音乐控制逻辑就能实现全应用任意页面调用启停。
第一步:创建全局单例音乐控制类
import android.content.Context; import android.media.MediaPlayer; public class MusicManager { private static volatile MusicManager INSTANCE; private MediaPlayer mediaPlayer; private int currentResId = -1; // 私有构造禁止外部实例化 private MusicManager() {} // 线程安全的单例获取方法 public static MusicManager getInstance() { if (INSTANCE == null) { synchronized (MusicManager.class) { if (INSTANCE == null) { INSTANCE = new MusicManager(); } } } return INSTANCE; } // 播放音乐 public void play(Context context, int resId) { // 统一用ApplicationContext避免持有Activity上下文导致内存泄漏 Context appContext = context.getApplicationContext(); try { // 播放同一首歌直接恢复播放 if (mediaPlayer != null && currentResId == resId) { if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } return; } // 切换歌曲先释放旧资源 release(); mediaPlayer = MediaPlayer.create(appContext, resId); currentResId = resId; mediaPlayer.start(); // 可选:播放完成自动释放资源 mediaPlayer.setOnCompletionListener(mp -> release()); } catch (Exception e) { e.printStackTrace(); } } // 暂停播放 public void pause() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } // 停止播放并重置状态 public void stop() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.reset(); mediaPlayer.release(); mediaPlayer = null; currentResId = -1; } } // 释放所有资源,应用退出时调用 public void release() { stop(); } }
第二步:修改MainActivity调用逻辑
替换wishButton方法中原有MediaPlayer相关代码:
public void wishButton(View view) { final EditText editText = findViewById(R.id.editTextTextPersonName); String name = editText.getText().toString(); Intent intent = new Intent(this, screen2.class); intent.putExtra("name", name); startActivity(intent); // 替换原有MediaPlayer创建和启动代码 MusicManager.getInstance().play(this, R.raw.happy_birthday_song); }
第三步:修改screen2停止逻辑
在displayMessage方法中调用全局控制类的停止方法:
public void displayMessage(View view) { // 直接全局调用停止音乐 MusicManager.getInstance().stop(); // 其他原有业务逻辑 }
注意事项
- 不要在音乐控制类中持有Activity上下文,统一使用ApplicationContext避免内存泄漏
- 如果需要应用退到后台后仍然保持播放,建议搭配前台Service使用,避免进程被系统回收
- 应用完全退出时建议调用
MusicManager.getInstance().release()主动释放MediaPlayer占用的系统资源
内容的提问来源于stack exchange,提问作者Tejas Patel
相关产品推荐
相关产品推荐

