如果在 onRestart() 之后调用 onStart(),是否在 onStart() 之前调用 onCreate()?

时间:2021-05-26 10:27:20

标签: android android-activity android-mediaplayer android-resources android-lifecycle

我不明白当我恢复活动时使用MediaPlayer方法中的release()方法释放onStop() obj的资源时,为什么MediaPlayer即使在 onStop() 方法中释放了 obj 并且我确定调用了 onStop() 方法,但单击播放按钮后仍然播放声音。那么发生这种情况的原因可能是什么,是在 onCreate() 方法调用 onRestart() 方法后立即调用 onStart() 方法还是有其他原因?

我的逻辑是,如果在 onStop() 方法中我释放了 MediaPlayer obj 的资源,那么 obj 中应该没有包含音频文件的实例,因此当活动恢复时没有音频应播放,因为 obj 在其资源释放后在 releaseMediaPlayerResources() 方法中被分配了 null 值,所以这就是为什么我认为 obj 获取实例 onCreate()必须调用,因为这是我为 MediaPlayer obj 分配音频文件的方法。

private MediaPlayer audio;
private Button playBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_list_view);
    playBtn = findViewById(R.id.playBtn);
        
    playBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                releaseMediaPlayerResources();
                audio = MediaPlayer.create(this, R.raw.song);
                audio.start();
            }
    });

}
@Override
protected void onStop() {
    super.onStop();
    releaseMediaPlayerResources();
    Toast.makeText(this, "onStop() releasing res...", Toast.LENGTH_SHORT).show();
}

private void releaseMediaPlayerResources() {
    if(audio!=null){
        audio.release();
        audio = null;
    }
}

2 个答案:

答案 0 :(得分:1)

参考这张图片,当我想知道什么时候调用什么函数时,它总是对我有帮助?
Android Activity Lifecycle

答案 1 :(得分:1)

<块引用>

为什么在 onStop() 方法中释放 obj 后,MediaPlayer 仍然可以播放声音?

因为点击每个按钮,您首先释放 MediaPlayer,然后创建它的新实例并开始:

releaseMediaPlayerResources();
audio = MediaPlayer.create(YourActivity.this, R.raw.song);
audio.start();
<块引用>

onRestart() 方法调用 onStart() 方法后是否立即调用 onCreate() 方法?

No

相关问题