四种启动模式:
-
standard:标准模式,默认的;
重复创建多个实例,每一次启动activity都会重新创建实例;
谁启动了这种模式的 Activity,新 Activity 就会运行在启动者所在的栈中;
ApplicationContext 启动 standard 的 Activity,会报错:因为standard类型的activity会进入到启动它的activity所在的任务栈中,而使用非activity类型的context并没有所谓的任务栈。 -
singleTop:栈顶复用模式
如果activity位于当前任务栈的顶部则不会重复创建,而是直接调用 onNewIntent() 方法,但是当activity不在栈顶,那么还是会重复创建。 -
singleTask:栈内复用模式
只要 Activity 在一个栈中有实例,多次启动此 Activity 都不会创建实例,也是直接调用 onNewIntent()
启动 singleTask 的 Activity 时,系统会先找有没有想要的任务栈,没有就新建个任务栈;有就看栈里有没有实例
栈内有实例,就会把该 Activity 调到栈顶,同时 clearTop(之前在它前面的都被清除)
一般用于 MainActivity,因为回到首页后需要清除之前的页面 -
singleInstance:栈内唯一
就是霸道一点的 singleTask
启动后新建一个任务栈,这个栈里只会有它一个,可以用于多个程序之间共享一个activity实例,多次启动的话,会调用onNewIntent方法
Intent中Flag的作用?
通过在Intent中设置flag:
- 我们可以设定activity的启动模式(比如使用FLAG_ACTIVITY_NEW_TASK指定为singleTask,使用FLAG_ACTIVITY_SINGLE_TOP指定为singleTop启动模式),
- 同时我们也可以使用flag去指定activity的运行状态,比如使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS让用户不能通过历史列表回到该activity。
疑问:那么对于使用flag设置启动模式和在代码中使用属性指定启动模式,哪种优先级更高呢?
实践后发现使用代码设置的启动模式优先级更高,其实也可以理解,如果xml中的优先级更高的话,那么当调用者拉起整个activity时就没有办法按照自己需要的启动模式进行设置
在通过intent设置flag的时候,我们看到有addFlag方法,那么对于addFlag做了个什么操作呢?查看源码我们可以看到其实就是在已有的flag基础上进行了一个|个操作,

通过这个或操作我们可以进行增加属性,对于android中的flag,通过位运算进行的操作含义如下:
下面的段落摘自:https://blog.csdn.net/Johnsco/article/details/81057111
①. 增加属性 “|”
如果需要向flag变量中增加某个FLAG,使用"|"运算符
flag |= XXX_FLAG;
原因: 如果flag变量没有XXX_FLAG,则 | 完后flag对应的位为1,如果有XXX_FLAG,则 | 完后值不会变对应位还是1.
②. 包含属性 “&”
如果需要判断flag变量中是否包含XXX_FLAG,使用"&"运算符
flag & XXX_FLAG != 0 或者 flag & XXX_FLAG = XXX_FLAG
原因: 如果flag变量里包含XXX_FLAG,则&完后flag变量对应的位为1,因为XXX_FLAG的定义保证了只有一位非0,其他位都为0,所以如果是包含的话&运算后值不为0,值为此XXX_FLAG的值,不包含的话值为0.
③.取消属性 “&~”
如果需要取消flag变量的XXX_FLAG, 使用 “&~”.
flag &= ~XXX_FLAG;
原因: 先对XXX_FLAG进行取反 则XXX_FLAG原来非0的那一位变为0,则使用&运算符后flag变量非0的那一位变为0,则意味着flag变量不包含XXX_FLAG
.
taskAffinity 属性
这个参数标示了一个activity所需要的任务栈的名字,默认情况下,所有的Activity所需要的任务栈名子为应用的包名,当Activity设置了taskAffinity属性,那么这个Activity被创建时就会运行在和taskaffinity相同的任务栈中。
要想使其生效,需要配合Intent.FLAG_ACTIVITY_NEW_TASK,或者配合allowTaskReparenting 属性使用,使用其中一个就行。
参考博客
https://blog.csdn.net/u011240877/article/details/71082720
https://blog.csdn.net/u010389391/article/details/78558475
https://blog.csdn.net/shanshan_1117/article/details/80439421

2649

被折叠的 条评论
为什么被折叠?



