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

求助:如何通过Service实现播放新歌曲时停止旧歌曲?

解决音乐App点击新歌曲时旧歌曲继续播放的问题

兄弟,我太懂你这种糟心的情况了——点了新歌曲,结果旧歌还在放,两首混在一起完全没法听。咱们来搞定这个问题!

核心问题分析

你现在的代码大概率是每次点击歌曲都新建了一个MediaPlayer实例,之前的实例没被停止也没释放资源,导致多个MediaPlayer同时在播放,自然就出现了“双响”的情况。

解决方案:全局管理MediaPlayer实例

咱们要在MainActivity里维护一个全局的MediaPlayer对象,每次播放新歌曲前先把旧的停下来、释放掉,再初始化新的播放任务。

第一步:声明全局MediaPlayer变量

在MainActivity类的顶部,声明一个全局的MediaPlayer:

private MediaPlayer mMediaPlayer; // 全局维护的播放实例

第二步:修改onItemClick逻辑

在点击歌曲的回调里,先处理旧的播放任务,再启动新的:

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    // 1. 先停止并释放正在播放的旧歌曲
    if (mMediaPlayer != null) {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop(); // 立即停止播放
        }
        mMediaPlayer.release(); // 释放底层资源
        mMediaPlayer = null; // 置空,避免后续引用到无效实例
    }

    // 2. 获取新歌曲的播放路径/资源ID(这里替换成你实际的获取逻辑)
    String songPath = ...; // 比如从列表里取出当前点击歌曲的路径
    // 或者如果是本地资源,用MediaPlayer.create(this, R.raw.song)

    // 3. 初始化新的MediaPlayer并播放
    mMediaPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(songPath));
    if (mMediaPlayer != null) {
        mMediaPlayer.start(); // 启动新歌曲播放

        // 可选:加上播放完成后的自动释放,避免资源浪费
        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
                mMediaPlayer = null;
            }
        });
    }
}

第三步:补充Activity销毁时的资源清理

别忘了在Activity退出的时候,也要清理MediaPlayer,防止内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    // 最后检查一遍,确保资源被释放
    if (mMediaPlayer != null) {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}

额外提醒

如果你的歌曲是从网络加载的(比如流媒体),还要注意取消旧的网络请求任务,避免旧的音频流还在后台加载播放。不过如果是本地歌曲,上面的方案就完全够用了。

这样修改后,每次点击新歌曲时,旧的播放任务都会被彻底终止,然后才会启动新的播放,就不会出现两首歌同时响的情况啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:35