打开一个新的activity时:
onCreate => onStart => onResume
关闭一个已有的activity时:
onPause => onStop => onDestroy
返回上一个activity时:
onRestart => onStart => onResume
当activity的启动模式为standard(系统默认)时,生命周期的方法是按照这样的顺序执行。但是当启动模式不同时,生命周期方法的执行顺序就有所不同。
首先,先来看一下activity的四种启动模式。
1、standard 标准模式
每次打开一个activity都会创建一个新的实例。
2、singleTop 栈顶复用模式
打开activity时,如果这个activity已经在任务栈的栈顶了,就不会创建新的activity实例,而是复用已经有的activity;如果不在栈顶则重新创建新的实例。
3、singleTask 栈内复用模式
打开activity时,如果在当前任务栈内已经存在,则会杀死它上面的所有任务,将这个activity置顶。
4、singleInstance 单实例模式
这算是一种加强版singleTask模式,打开activity时,会开一个新的任务栈,并且只会存在一个实例。
那么问题就复杂了,遇到不同的启动模式,每个activity的生命周期就会出现很多变化。不过有一点我们要牢记,生命周期是存在对应关系的:
onCreate 与 onDestroy 对应
onStart 与 onStop 对应
onResume 与 onPause 对应
一个activity如果执行了onPause方法,再次打开它一定会执行onResume方法;如果执行了onStop方法,再次打开它一定会执行onStart方法;如果被销毁(onDestroy),再次打开一定需要重新创建(onCreate)。
如果打开一个activity,并且这个activity是被复用的,打开时会执行一个新的方法onNewIntent(Intent intent),这是需要注意的。
接下来说一下结合启动模式,生命周期执行的过程。
1、先从最简单的开始。
activityA的启动模式是standard,activityB的也是standard。在A里打开B:
A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop
这时候我们点击返回键:
B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy
2、上面的是基础,接下来是难一点的。
activityA的启动模式是singleTask,activityB的是standard。先在A里打开B,之后再用B打开A时:
B:onPause -> A:onNewIntent -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy
3、这个和上面的差不多,都是看一下activity被复用时,走的生命周期有哪些。
activityA的启动模式是singleTop。在A里再次打开A:
A:onPause -> A:onNewIntent -> A:onResume
4、还有就是开了新的任务栈时,activity被复用时,生命周期的执行顺序。
activityA的启动模式是singleTop,activityB的是singleInstance。先在A里打开B,之后再用B打开A时:
B:onPause -> A:onNewIntent -> A:onRestart -> A:onStart -> A:onResume -> B:onStop
5、现在再添加一点东西,如果将打开的activity设置为透明主题,再来看一下。
activityA的启动模式是singleTop,activityB的是standard,activityB的主题是透明的。
先在A里打开B:
A:onPause -> B:onCreate -> B:onStart -> B:onResume
接下来,再在B里打开A:
B:onPause -> A:onStop -> A:onCreate -> A:onStart -> A:onResume -> B:onStop
可以发现,在B打开A时,先执行上一个A的onStop方法,之后再重新创建一个新的A。
6、如果是activityA的启动模式是singleTask就简单了。
activityA的启动模式是singleTask,activityB的启动模式是standard,activityB设置了透明主题。
先在A里打开B,之后在B里打开A时:
B:onPause -> A:onNewIntent -> A:onResume -> B:onStop -> B:onDestroy
结合启动模式,生命周期方法执行的顺序还有其他的情况,大家可以慢慢尝试。
其实在实际应用中,这些情况遇到的并不多,研究这些内容的意义更多的是在于加深对activity生命周期和启动模式的理解,锻炼逻辑思维。