全栈工程师开发手册 (作者:栾鹏)
​​ 安卓教程全解​​

每一个Activity的状态是由它在Activity栈中所处的位置所决定的, Activity其是当前所有正在运行的Activity的后进先出的集合。 当一个新的Activity启动时 , 它就变为Activity 状态, 并被移动到栈顶 。 如果用户使用Back(返回)按钮返回到了刚才的Activity, 或者前台Activity被关闭了, 那么栈中的下一个Activity 就会移动到栈顶 ,变为活动状态。

安卓activity生存周期的onCreate、onRestoreInstanceState、onRestart、onStart、onResume、onPause、onStop、onDestroy_窗口

安卓activity生存周期的onCreate、onRestoreInstanceState、onRestart、onStart、onResume、onPause、onStop、onDestroy_activity_02

这里进行以下操作演示窗口的生命周期:

1、启动activity1,点击activity1中的控件进入activity2,

2、点击手机home键,切换到手机主界面。

3、进入已经打开的activity2

4、点击返回键,关闭activity2,返回到activity1。

通过以上几步,了解窗口的onCreate、onRestoreInstanceState、onRestart、onStart、onResume、onSaveInstanceState、onPause、onStop、onDestroy各阶段的执行触发点。

activity2的窗口代码为

public class Activity2 extends Activity{  

//完整生存期开始时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //调用基类方法
setContentView(R.layout.activity2); //setContentView可以通过扩展布局资源来对用户界面进行布局
Log.v("生命周期", "完整生存期开始");
}

//在onCreate方法完成后调用,用户恢复UI状态
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//从savedInstanceState恢复UI状态
//这个bundle也被传递给onCreate.
//自activity上次可见之后,只有当系统终止了该activity时,才会被调用
Log.v("生命周期", "恢复UI状态");
}

//在随后的activity进程的可见生存期之前调用
@Override
public void onRestart(){
super.onRestart();
// 加装载改变,知道activity在此进程中已经可见
Log.v("生命周期", "重启");
}

//在可见生存期(可见不一定聚焦)的开始时调用
@Override
public void onStart(){
super.onStart();
//既然activity可见,就应用任何要求的UI Change
Log.v("生命周期", "启动");
}

//在activity状态生存期(前台聚焦期)开始时调用
@Override
public void onResume(){
super.onResume();
//恢复activity需要,但是当它处于不活动状态时被挂起的暂停的UI更新、线程或进程
//在activity状态生命周期结束的时候调用,用来保存UI状态的改变
Log.v("生命周期", "恢复");
}

// 把UI状态改变保存到savedInstanceState
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//如果进程在运行时被终止或被重启,那么这个Bundle会保存UI状态,并将被传递给onCreate和onRestoreInstanceState用来恢复UI
//onPause前会调用此函数
super.onSaveInstanceState(savedInstanceState);
Log.v("生命周期", "保存UI状态");
}

// 在activity状态生存期(前台聚焦期)结束时调用
@Override
public void onPause(){
// 挂起不需要更新的UI更新、线程或者cpu密集的进程
//当activity不是前台的活动状态的activity时
super.onPause();
Log.v("生命周期", "暂停");
}

//在可见生存期(可见不一定聚焦)结束时调用
@Override
public void onStop(){
// 挂起不需要的UI更新、线程或处理(传感器监听器、GPS,定时器、service)
//当activity不可见时,保存所有的编辑或者状态改变,因为在调用这个方法后,进程可能会被禁止
super.onStop();
Log.v("生命周期", "停止");
}

//在完整生存期结束时调用
@Override
public void onDestroy(){
// 清理所有的资源,包括结束线程、关闭数据库连接等
super.onDestroy();
Log.v("生命周期", "销毁");
}

}

activity1的窗口函数为

public class Activity1 extends Activity{  

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
//点击控件,切换窗口
TextView tv = (TextView)findViewById(R.id.activity1_text1);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tosub();
}
});
}

//切换到窗口2
public void tosub() {
Intent myintent = new Intent();
myintent.setClass(Activity1.this,Activity2.class);
startActivity(myintent); //启动新页面
}
}

运行打印输出如下:

安卓activity生存周期的onCreate、onRestoreInstanceState、onRestart、onStart、onResume、onPause、onStop、onDestroy_安卓_03

1、从activity1进入activity2,依次启动了onCreate、onStart、onResume函数

2、点击键盘后面键,使app进入后台,依次启动了onPause、onSaveInstanceState、onStop

3、从手机home界面重新进入已打卡的app,依次已启动了onRestart、onStart、onResume

在activity2窗口中点击物理返回键,关闭activity2,依次启动了onPause、onStop、onDestroy