Android Media Player在后台播放,但在应用程序被杀时不会停止

sha*_*ala 19 audio android media-player android-activity

我是Android新手,所以我遇到了问题.在Android中,我想在我的音乐播放器启动后立即播放背景音乐,并且即使活动从一个变为另一个,它也会继续播放.我试过这段代码:

MediaPlayer music = MediaPlayer.create(MainActivity.this, R.drawable.bgscore);
music.start();
Run Code Online (Sandbox Code Playgroud)

但是,当用户关闭应用程序时声音应该停止,但事实并非如此.我怎样才能做到这一点?

Bha*_*vna 8

创建一个单独的类来处理几个条件

import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;

public class MusicManager {
    static final int MUSIC_PREVIOUS = -1;
    private static final String TAG = "MusicManager";
    static MediaPlayer mp;
    private static int currentMusic = -1;
    private static int previousMusic = -1;


    public static void start(Context context, int music) {
        start(context, music, false);
    }

    public static void start(Context context, int music, boolean force) {
        if (!force && currentMusic > -1) {
// already playing some music and not forced to change
            return;
        }

        if (music == MUSIC_PREVIOUS) {
            Log.d(TAG, "Using previous music [" + previousMusic + "]");
            music = previousMusic;
        }
        if (currentMusic == music) {
// already playing this music
            return;
        }
        if (currentMusic != -1) {
            previousMusic = currentMusic;
            Log.d(TAG, "Previous music was [" + previousMusic + "]");
// playing some other music, pause it and change
            pause();
        }
        currentMusic = music;
        Log.d(TAG, "Current music is now [" + currentMusic + "]");
        if (mp != null) {
            if (!mp.isPlaying()) {
                mp.start();
            }
        } else {
            mp = MediaPlayer.create(context, R.raw.backGroundMusic); //Ur BackGround Music
        }

        if (mp == null) {
            Log.e(TAG, "player was not created successfully");
        } else {
            try {
                mp.setLooping(true);
                mp.start();
            } catch (Exception e) {
                Log.e(TAG, e.getMessage(), e);
            }
        }
    }

    public static void pause() {
        if (mp != null) {
            if (mp.isPlaying()) {
                mp.pause();
            }
        }

// previousMusic should always be something valid
        if (currentMusic != -1) {
            {
                previousMusic = currentMusic;
                Log.d(TAG, "Previous music was [" + previousMusic + "]");
            }
            currentMusic = -1;
            Log.d(TAG, "Current music is now [" + currentMusic + "]");
        }
    }

    public static void release() {
        Log.d(TAG, "Releasing media players");
        try {
            if (mp != null) {
                if (mp.isPlaying()) {
                    mp.stop();
                }
                mp.release();
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }

        if (currentMusic != -1) {
            previousMusic = currentMusic;
            Log.d(TAG, "Previous music was [" + previousMusic + "]");
        }
        currentMusic = -1;
        Log.d(TAG, "Current music is now [" + currentMusic + "]");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你MainActivity定义一个全局布尔变量并将其设置为trueonCreate()ie中的setContentView(....)之前

    boolean continueBGMusic;
    ....
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        continueBGMusic=true;
    setContentView(R.layout.activity_main);
    .....
    }
Run Code Online (Sandbox Code Playgroud)

然后更新onPause()

    public void onPause()
        {
            super.onPause();
            if(!continueBGMusic)
                MusicManager.pause();
    }
Run Code Online (Sandbox Code Playgroud)

onResume()作为

    public void onResume()
        {
            super.onResume();

                continueBGMusic=false;
                MusicManager.start(this,R.raw.backGroundMusic);
    }
Run Code Online (Sandbox Code Playgroud)

使用布尔变量和两个方法更新所有三个活动.


Siv*_*a K 2

尝试这个

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        music.stop();
        return true;
    }

    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

否则,如果您有任何单独的按钮操作用于关闭应用程序,您可以调用 music.stop();

  • 这里的巨大假设是用户使用后退按钮导航出应用程序,并且应用程序只有一个活动。两者都不是给定的。 (2认同)
  • Siva,如果我想要一个像你这样的临时解决方案,我就不会在堆栈溢出中问这个问题。这是一个显而易见但不正确的答案。在在这里发布问题之前已经想到了所有这些临时解决方案。我想要的只是一个在任何条件下都有效的正确解决方案。 (2认同)