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的任务栈中,这就是所谓的换栈能力。