今天在学习了慕课网的关于activity生命周期实际的应用场景的课程,总结一下学到的知识点。
1)Activity生命周期基础知识:
Activity生命周期的7个回调函数:onCreate --> onStart --> onResume --> onPause --> onStop --> onDestroy以及onRestart
启动一个Activity: onCreate --> onStart --> onResume
销毁一个Activity: onPause --> onStop --> onDestroy
返回上一个Activity: onRestart --> onStart --> onResume
进入另一个Activity: onPause --> onStop
弹出一个对话框: onPause
从一个Activity A跳转到另一个ActivityB:A_onCreate --> A_onStart --> A_onResume --> A_onPause --> B_onCreate --> B_onStart --> B_onResume --> A_onStop
为什么不是A_onPause --> A_onStop --> B_onCreate --> B_onStart --> B_onResume ?
答:防止A在启动B时B产生系统Crash,而A已经onStop,将会产生没有界面的黑屏状态,产生很差的用户体验;
为什么不是B_onCreate --> B_onStart --> B_onResume --> A_onPause --> A_onStop?
答:防止在在已经进入B的时候,A的一些音乐、视频等活动还在运行,还没来得及暂停A,干扰B。
综上:A将先调用onPause暂停自身的任务,然后去启动B,不至于干扰B的活动;如果B正常启动,再去调用A的onStop释放资源。
2)Demo背景需求
3)参考代码
MainActivity.java
package com.steven.activitylifecycleapplicationdemo;
import android.content.Intent;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button;
private final String TAG = "MainActivity";
private MediaPlayer mediaPlayer;
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
mediaPlayer = MediaPlayer.create(this, R.raw.test);
mediaPlayer.start();
Log.i(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
//判断音乐之前是否被pause
if(position != 0){
mediaPlayer.seekTo(position); //跳转到之前的播放位置
mediaPlayer.start(); //再次开始播放音乐
}
Log.i(TAG, "onResume");
}
//暂停当前播放
@Override
protected void onPause() {
//mediaPlayer处于播放状态,则将其pause
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
position = mediaPlayer.getCurrentPosition(); //获取当前pause时的播放位置
}
super.onPause();
Log.i(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
//在销毁时,释放mediaPlayer的资源,或者释放handcsdnler,注销Broadcast等动作
if(mediaPlayer != null){
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart");
}
}