Android 中的四种启动模式 和 Intent中Flag的使用

四种启动模式:

  1. standard:标准模式,默认的;
    重复创建多个实例,每一次启动activity都会重新创建实例;
    谁启动了这种模式的 Activity,新 Activity 就会运行在启动者所在的栈中;
    ApplicationContext 启动 standard 的 Activity,会报错:因为standard类型的activity会进入到启动它的activity所在的任务栈中,而使用非activity类型的context并没有所谓的任务栈。

  2. singleTop:栈顶复用模式
    如果activity位于当前任务栈的顶部则不会重复创建,而是直接调用 onNewIntent() 方法,但是当activity不在栈顶,那么还是会重复创建。

  3. singleTask:栈内复用模式
    只要 Activity 在一个栈中有实例,多次启动此 Activity 都不会创建实例,也是直接调用 onNewIntent()
    启动 singleTask 的 Activity 时,系统会先找有没有想要的任务栈,没有就新建个任务栈;有就看栈里有没有实例
    栈内有实例,就会把该 Activity 调到栈顶,同时 clearTop(之前在它前面的都被清除)
    一般用于 MainActivity,因为回到首页后需要清除之前的页面

  4. singleInstance:栈内唯一
    就是霸道一点的 singleTask
    启动后新建一个任务栈,这个栈里只会有它一个,可以用于多个程序之间共享一个activity实例,多次启动的话,会调用onNewIntent方法

Intent中Flag的作用?

通过在Intent中设置flag:

  1. 我们可以设定activity的启动模式(比如使用FLAG_ACTIVITY_NEW_TASK指定为singleTask,使用FLAG_ACTIVITY_SINGLE_TOP指定为singleTop启动模式),
  2. 同时我们也可以使用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

https://blog.csdn.net/Johnsco/article/details/81057111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值