超详细的activity启动模式讲解

在记录自己的理解之前先推荐一篇文章彻底弄懂Activity四大启动模式,这篇文章写得挺好的,我也是从这里受到启发,并写了很多例子才明白的,不过在写例子的过程中,我发现里面讲的东西还是有缺陷,故以记之。


1、standard启动模式。

被启动的activity一般需要依附于某个任务栈,如果当前被启动的activity是standard模式,则:

  1)如果它是从某个任务栈内被启动,则它依附于这个任务栈而不会去新建任务栈,这个时候它的taskAffinity属性是无效的,即它所在任务栈的taskId仍然是启动它的任务栈的taskId,但它的taskAffinity属性是不会从启动它的任务栈里面继承的,即仍是manifest文件里面配置的值但是没有起到作用;

如果它不是从某个任务栈内启动,比如启动界面或者从一个singleInstance的activity里面启动的话就不会有默认的任务栈,这个时候它的taskAffinity属性就生效了:它会去整个系统里面查找是否有taskAffinity的值与它的taskAffinity的值一样的任务栈,如果有则这个即将生成的standardactivity实例就依附于这个任务栈,如果没有则新建taskAffinity值相同的任务栈并使得这个即将生成的standard activity实例依附于它。

总结一波:两种情况都是寻找新建activity的依附的任务栈,如果是第一种情况新建的activity所在的taskId的taskAffinity属性值和activity的对应的属性值是不同的,如果是第二种情况则是相同的。

2)第二步的核心就是根据模式的规则处理:比如现在是standard模式则直接新建activity实例并往它所依附的任务栈里面压入,注意启动activity时都会把它所依附的任务栈设置成前台任务栈


2、singleTop启动模式。

1)singleTop模式的第一步和standard模式的第一步是一样的,不在赘述。

2)第二步也是根据模式的规则处理,只是规则和standard不一样:首先判断启动当前activity的方式是startActivity还是startActivityForResult,前者则判断所依附的任务栈的栈顶是否有该activity实例,如果有则重用,没有则新建压入;后者则直接新建压入,这是两个启动方式的区别。注意启动activity时都会把它所依附的任务栈设置成前台任务栈


3、singleTask启动模式。

具有全局唯一性,看下去就知道了。

1)singleTask启动模式的第一步和前两者不一样:这种模式下直接判断整个系统里面是否存在taskAffinity值和当前被启动的activity的taskAffinity值相同的任务栈,如果不存在则创建。

总结一波:这种模式的核心思想还是和前两者一样的都是寻找依附的任务栈,只是寻找的方式不一样:此模式在寻找任务栈时不依赖于启动它的任务栈。

2)第二步也是根据模式的规则处理,只是规则和其他模式不一样:直接判断所依附的任务栈里面是否存在当前activity实例,如果存在则把其之上的activity实例全部弹出,如果不存在则直接创建activity实例并压入栈。这样子看起来这个模式反倒是最好理解。

4、singleInstance启动模式。

具备singleTask的所有特性,唯一的区别是独占一个task任务栈,即它所在的任务栈只能有它自己,就算是它启动了一个singleTop或者standard的activity,被启动的activity也不能压入这个栈,这在1、2节里面也有讲解;但是singleTask模式的activity所在的任务栈里面可以有其他各种模式的activity实例。


四种模式总结:不管哪种模式都是先确定所依附的任务栈,然后根据对应的规则进行处理,最后都会把这个任务栈调度到前台。


特例:如果一个activity是启动界面,当它完成第一步即找到所依附的任务栈后,如果这个任务栈的情况是这样的:

如果这个任务栈时其他app开辟的,则把这个任务栈调度到前台但不会进行对应的规则处理,即不会去新建实例也不会往这个任务栈压入activity实例。


说明:以上是我根据开头推荐的博客和群英传第八章的总结,这篇博客写的比较具体而群英传写的比较抽象,比较少设计代码层面的解释,大家可以自己写几个列子,发现问题随时可以和我交流,谢谢!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值