Activity启动模式和flag学习,及Activity的换栈能力

1 四种启动模式

standard,singleTop,singleTask,singleInstance.
解释:
statndard :什么启动模式都不设置就是默认模式,启动一个activity如果Task栈不存在则新建一个Task存入activity实例,如果Task栈已经存在则直接把activity实例压入栈中。

singleTop:launch mode设置为singleTop,如果要启动的activity已经在Task栈顶,再次跳转打开Activity不会创建新实例,不位于栈顶则正常压入栈中。

singleTask:如果要启动的activity已经位于Task栈中,位于栈顶则什么都不做,不位于栈顶会把位于该Activity实例上的其他activity实例出栈清除。

singleInstance:设置了singleInstance启动模式的activiyt每次启动都会新建一个栈,要慎用,因为android系统只有一个前台Task栈,如果前台task栈全部出栈则app将不可见。

2 举例说明Activity启动模式

standard: 默认方式,Task栈中已经有ActivityA-ActivityB 此时启动任何一个Activity都会重新入栈,变成ActivityA-ActivityB-ActivityC(ActivityC可能是A或B或者其他Activity的实例)。

singleTop:
Task栈中ActivityA-ActivityB-ActivityC,如果启动ActivityD ,直接入栈变成ActivityA-ActivityB-ActivityC-ActivityD 。
Task栈中ActivityA-ActivityB-ActivityC,如果启动ActivityC,由于ActivityC的实例已经在栈顶则没有实例创建依然为ActivityA-ActivityB-ActivityC。
Task栈中ActivityA-ActivityB-ActivityC,如果启动ActivityB,由于ActivityB的实例没有在栈顶,会创建ActivityB实例,Task栈为ActivityA-ActivityB-ActivityC-ActivityB。

singleTask:

Task栈中ActivityA-ActivityB-ActivityC,如果启动ActivityD ,直接入栈变成ActivityA-ActivityB-ActivityC-ActivityD 。
Task栈中ActivityA-ActivityB-ActivityC,如果启动ActivityC,由于ActivityC的实例在栈顶则没有实例创建依然为ActivityA-ActivityB-ActivityC。
Task栈中ActivityA-ActivityB-ActivityC,如果启动ActivityB,由于ActivityB的实例没有在栈顶,会ActivityC实例出栈,Task栈为ActivityA-ActivityB。

singleInstance:
Task栈中ActivityA-ActivityB-ActivityC,如果启动设置了singleInstance的ActivityD ,会创建新的Task栈存放ActivityD 实例。

3 Intent和启动模式有关的Flag参数

FLAG_ACTIVITY_NEW_TASK:
第一个用的比较多的flag为FLAG_ACTIVITY_NEW_TASK,如果我们要利用非Activity型Context启动Activity需要设置次标记。
这个flag的使用如果不配合Task affinity,则没有特殊含义就是启动一个Activity然后入栈,因为如果不手动设置taskAffinity,默认所有Activity的taskAffinity都是包名。
如果设置了不同的taskAffinity,并且要启动的Activity设置了FLAG_ACTIVITY_NEW_TASK,系统首先会查找有没有和要启动Activity的taskAffinity相同的task栈存在,如果有将Activity实例压入那个栈,如果不存在则会新建一个和启动activity的taskaffinity相同的栈将其压入。

FLAG_ACTIVITY_CLEAR_TOP:
和Launch mode设置成singleTask相似。

FLAG_ACTIVITY_NO_HISTORY:
不会把activity实例压入栈中,相当于不存在,在它内部启动的Activity会直接压入栈中。

FLAG_ACTIVITY_SINGLE_TOP:
和Launch mode的singleTop相似。

4换栈能力

allowTaskReparenting:
Activity其他属性(未深入学习),只讲解一个allowTaskReparenting:
allowTaskReparenting:配合FLAG_ACTIVITY_NEW_TASK 标记。
把Activity的allowTaskReparenting属性设置成true时,Activity就有了换栈能力。
一个Activity当前处于某个任务栈当中的(affinity不同),但是当有一个具有相同的affinity值的任务栈创建,这个任务切换到前台的时候,该Activity就可以转移到现在的这个任务当中。
举例:应用B的某个activity设置了export:true,并且设置了taskAffinity,和应用A的taskAffinity不同。
应用A可以启动应用B的activityC,当前启动的activityC处于应用A的任务栈中,当应用B启动时,activityC会跑到应用B的任务栈中,这就是所谓的换栈能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值