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

四种启动模式:

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

你可以看到使用每点击一次 ,都会弹出一个新的activity

  1. singleTop:栈顶复用模式
    如果位于栈顶则不会重复创建,不调用 onCreate 和 onStart,直接调用 onNewIntent() 方法,但是当activity不在栈顶,那么还是会重复创建。
  1. singleTask:栈内复用模式
    只要 Activity 在一个栈中有实例,多次启动此 Activity 都不会创建实例,也是直接调用 onNewIntent()
    启动 singleTask 的 Activity 时,系统会先找有没有想要的任务栈,没有就新建个任务栈;有就看栈里有没有实例
    栈内有实例,就会把该 Activity 调到栈顶,同时 clearTop(之前在它前面的都被清除)
    一般用于 MainActivity,因为回到首页后需要清除之前的页面
可以看到,当我们再次启动这个activity时,栈顶的actiivty退出了
  1. singleInstance:栈内唯一
    就是霸道一点的 singleTask
    启动后新建一个任务栈,这个栈里只会有它一个,可以用于多个程序之间共享一个activity实例,多次启动的话,会调用onNewIntent方法

    可以看到多次点击启动自身另一个栈中只有这一个activity
    上面的例子代码:

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设置启动模式和在代码中使用属性指定启动模式,哪种优先级更高呢?
实践后发现使用activity设置的启动模式优先级更高,其实也可以理解,如果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
.

参考博客
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

猜你喜欢

转载自blog.csdn.net/liu_12345_liu/article/details/104603442