为什么没有完成();结束媒体播放器?

时间:2017-06-27 19:18:50

标签: android

那么,为什么不呢?

根据我的理解,finish()会破坏整个活动,因此它也应该破坏正在运行的媒体播放器。

这是我的代码:

MediaPlayer ourSong;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ourSong = MediaPlayer.create(this, R.raw.hungat);
    ourSong.start();
    Thread timer = new Thread() {
        @Override
        public void run() {
            try {
                sleep(5000);

            } catch (InterruptedException e){
                e.printStackTrace();
            }finally {
                Intent i1 = new Intent("android.intent.action.MAINACTIVITY");
                startActivity(i1);
            }
        }
    };
    timer.start();
}
@Override
protected void onPause() {
    super.onPause();
    finish();
}

}

3 个答案:

答案 0 :(得分:0)

当您致电finish()时,它会一直运行,直到控制权返回给Android。 由于您没有停止MediaPlayer实例,因此不会传递控件。

在完成活动之前停止并释放它,并包括onDestroy(),以便在活动结束时正确处理。

有关详细信息,请查看官方API

MediaPlayer ourSong;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ourSong = MediaPlayer.create(this, R.raw.hungat);
    ourSong.start();

    Thread timer = new Thread() {
        @Override
        public void run() {
            try {
                sleep(5000);
            } catch (InterruptedException e){
                e.printStackTrace();
                destroyMediaPlayer();
            }finally {
                Intent i1 = new Intent("android.intent.action.MAINACTIVITY");
                startActivity(i1);
            }
        }
    };
    timer.start();
}

@Override
protected void onPause() {
    super.onPause();
    destroyMediaPlayer();
    finish();
}

@Override
protected void onDestroy() {
    super.onPause();
    destroyMediaPlayer();
    finish();
}

private void destroyMediaPlayer(){
    if(ourSong != null){
      ourSong.stop();
      ourSong.release();
    }
}

答案 1 :(得分:0)

MediaPlayer未与活动相关联,并且不知道活动正在被销毁。因此,MediaPlayer不受被破坏活动的影响,并继续做你告诉它做的任何事情。

在某种程度上,这是因为MediaPlayer不需要活动 - 很多时候,MediaPlayer由服务管理,因为媒体播放应独立于用户使用UI。

欢迎您安排在活动被销毁时停止MediaPlayer - 正如其他人所指出的那样stop()release() MediaPlayer onDestroy() 。但是,你必须自己,否则MediaPlayer无法知道它应该停止。

答案 2 :(得分:0)

因为它是一个线程

使用这个                  runnable.terminate();                  的Thread.join();

参考此thread