android里activity的生命周期和启动模式

activity的生命周期方法一般来说有七个,他们执行的顺序如下图。


生命周期.jpg


打开一个新的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生命周期和启动模式的理解,锻炼逻辑思维。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值