活动恢复时Android Mediaplayer会出现多个实例

活动恢复时Android Mediaplayer会出现多个实例,android,streaming,android-mediaplayer,Android,Streaming,Android Mediaplayer,我正在开发一个应用程序,使用内置的Android Mediaplayer播放流。除了当我按下“主页”按钮,然后再次打开活动时,应用程序只是启动了一个新的mediaplayer实例,我可以听到两次流,而不可能停止第一次流 情景 我的应用程序只包含一个活动 我第一次打开我的应用程序,流就开始了 按下home(主页)按钮,活动“最小化”,但音乐仍在播放 我再次打开我的应用程序,它只是启动了一个新的mediaplayer实例,两次播放相同的音乐 如果mediaplayer为空或正在播放,我会检查onRe

我正在开发一个应用程序,使用内置的Android Mediaplayer播放流。除了当我按下“主页”按钮,然后再次打开活动时,应用程序只是启动了一个新的mediaplayer实例,我可以听到两次流,而不可能停止第一次流

情景

我的应用程序只包含一个活动

  • 我第一次打开我的应用程序,流就开始了
  • 按下home(主页)按钮,活动“最小化”,但音乐仍在播放
  • 我再次打开我的应用程序,它只是启动了一个新的mediaplayer实例,两次播放相同的音乐
  • 如果mediaplayer为空或正在播放,我会检查onResume,但不知何故它似乎总是空的,因此会创建一个新实例

    我的伪代码

    public class MainActivity {
    
    private MediaPlayer _mp;
    
    private PlayTask _playTask;
    private PauseTask _pauseTask;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    protected void onResume(){
        super.onResume();
    
        if(_mp != null && _mp.isPlaying()){
            // I should find a playing mediaplayer here but it's always null!!!
            Toast.makeText(MainActivity.this, "Playing mediaplayer found!", Toast.LENGTH_SHORT).show();
        }
        else{
            Toast.makeText(MainActivity.this, "No mediaplayer found :(", Toast.LENGTH_SHORT).show();
        }
    }
    
    /* ...:::============= *** ASYNCTASK Definition START *** =============:::... */
    
    private class PlayTask extends AsyncTask<Void, Void, Integer> {
    
        @Override
        protected void onPreExecute() {
            if(_mp == null)
                    _mp = new MediaPlayer();
                else if(_mp.isPlaying()){
                    _mp.stop();
                    _mp.release();
                    _mp = null;
                    _mp = new MediaPlayer();
                }
        }
    
        @Override
        protected Integer doInBackground(Void...voids) {
            try{
                _mp.setDataSource(URL_DATASOURCE);
                _mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                _mp.prepare();
                _mp.start();
            }
            catch(Exception ex){
            }
            return 0;
        }
    
        @Override
        protected void onPostExecute(Integer i) {
    
        }
    }
    
    private class PauseTask extends AsyncTask<Void, Void, Integer> {
    
        @Override
        protected void onPreExecute() {
            // Do Nothing here...for now
        }
    
        @Override
        protected Integer doInBackground(Void...voids) {
            _mp.stop();
            _mp.release();
            _mp = null;
            return 0;
        }
    
        @Override
        protected void onPostExecute(Integer i) {
        }
    }
    
    
    public void playPause(View view){
        if(_play){
            _playTask = new PlayTask();
            _playTask.execute();
        }
        else{
            _pauseTask = new PauseTask();
            _pauseTask.execute();
        }
    }
    
    公共类活动{
    私人媒体播放器;
    私人游戏任务(PlayTask);;
    私人Pausetasku PauseTask;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }
    @凌驾
    受保护的void onResume(){
    super.onResume();
    如果(\u-mp!=null&&u-mp.isPlaying()){
    //我应该在这里找到一个正在播放的mediaplayer,但它总是空的!!!
    Toast.makeText(MainActivity.this,“正在播放的mediaplayer已找到!”,Toast.LENGTH_SHORT.show();
    }
    否则{
    Toast.makeText(MainActivity.this,“未找到mediaplayer:(”,Toast.LENGTH_SHORT.show();
    }
    }
    /*…::================***异步任务定义开始***====================================================================================================***异步任务定义开始****/
    私有类PlayTask扩展了AsyncTask{
    @凌驾
    受保护的void onPreExecute(){
    如果(_mp==null)
    _mp=新媒体播放器();
    否则如果(\mp.isPlaying()){
    _mp.stop();
    _mp.release();
    _mp=null;
    _mp=新媒体播放器();
    }
    }
    @凌驾
    受保护的整数doInBackground(Void…voids){
    试一试{
    _mp.setDataSource(URL\u数据源);
    _mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    _mp.prepare();
    _mp.start();
    }
    捕获(例外情况除外){
    }
    返回0;
    }
    @凌驾
    受保护的void onPostExecute(整数i){
    }
    }
    私有类PauseTask扩展异步任务{
    @凌驾
    受保护的void onPreExecute(){
    //现在什么都不要做
    }
    @凌驾
    受保护的整数doInBackground(Void…voids){
    _mp.stop();
    _mp.release();
    _mp=null;
    返回0;
    }
    @凌驾
    受保护的void onPostExecute(整数i){
    }
    }
    公共无效播放暂停(视图){
    如果(_play){
    _playTask=新的playTask();
    _playTask.execute();
    }
    否则{
    _pauseTask=新的pauseTask();
    _pauseTask.execute();
    }
    }
    
    }


    有什么想法吗?谢谢你需要分享你的代码。看我的代码。我有一个按钮可以触发
    播放暂停
    方法。当我播放时,我会创建一个新的mp实例。当我回家并再次打开活动时,我应该能够在
    onResume
    中获得相同的mp实例,但由于某些原因,它总是空的。请保留该对象nto单例类。活动不是地方。更好的是从服务运行媒体播放器。