Android MediaPlayer状态更改

Android MediaPlayer状态更改,android,android-activity,media-player,activity-lifecycle,Android,Android Activity,Media Player,Activity Lifecycle,我希望这不是一个愚蠢的问题,因为我是Android新手,但我在处理MediaPlayer的状态变化时遇到了麻烦。mediaplayer在屏幕上工作正常,在屏幕不可见时继续播放声音,但当我返回活动并尝试停止mediaplayer时,它不会停止。无论如何,我看不到从mp获得streamID,我可以在onPause和onResume上保存和恢复它。我一定错过了一些简单的东西。以下是我目前掌握的一些信息片段: public class Noise extends Activity {

我希望这不是一个愚蠢的问题,因为我是Android新手,但我在处理MediaPlayer的状态变化时遇到了麻烦。mediaplayer在屏幕上工作正常,在屏幕不可见时继续播放声音,但当我返回活动并尝试停止mediaplayer时,它不会停止。无论如何,我看不到从mp获得streamID,我可以在onPause和onResume上保存和恢复它。我一定错过了一些简单的东西。以下是我目前掌握的一些信息片段:

    public class Noise extends Activity {
       public MediaPlayer mp;

     public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layour.main);

        Button startButton = (Button)findViewById(R.id.startButton);
        Button stopButton = (Button)findViewById(R.id.stopButton);

        mp = MediaPlayer.create(this, R.raw.noise);

        startButton.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v){
                 playSoundLoop();
                 }
               });

        stopButton.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v){
                 stopSound();
                 }
               });
       }

    public void playSoundLoop(){
         mp.setLooping(true);
         mp.start();
     }

    public void stopSound(){
         mp.pause();
         //Had originally tried mp.stop, mp.reset, mp.prepare, but that didn't work any better
     }

}

我认为您没有取消分配原始MediaPlayer实例。因此,当您离开活动并返回时,会再次调用
onCreate()
,最后会得到两个实例,直到内存压力导致旧实例被释放

简单的解决方案是在您的活动离开前台时释放它,例如:

@Override
    onPause() {
    mp.release();
    super.onPause();
}

但是,如果您希望音乐继续在后台播放,则需要将MediaPlayer引用移动到活动生命周期之外的某个位置—可能移动到服务中。

您的活动是否被销毁?在onCreate中添加日志语句,查看是否正在创建MediaPlayer的新实例。这看起来很奇怪,因为如果是这样的话,对pause()的调用应该通过一个非法的状态异常。这是有道理的。谢谢你的快速回复。我只是将其设置为暂停并在暂停时释放mediaplayer,现在一切似乎都正常,但我希望在后台播放音乐。你说得对,我想我需要一个服务来做到这一点。我觉得让它在后台播放似乎很容易哈,对。在我看来,MediaPlayer有点痛苦。如果你继续写下去,你可能会发现我写的东西很有用。它提供了对当前状态的访问,这似乎是非常缺少的功能。哇。非常感谢。我会把它保存在我的武器库里。在我的测试中,我切换到soundpool,这给了我更多的循环选项(因为我想根据用户输入循环一定次数),但它似乎并不比mediaplayer好多少。这是可行的,但是没有太多的文档。再次感谢你的帮助!我试图实现自己的状态,刚刚找到你的包装-这看起来真的写得很好!