Activity启动模式总结

来源:互联网 发布:dh密钥交换算法 编辑:程序博客网 时间:2024/06/07 07:15

1.在standard启动模式下,A启动了B(标准模式),那么B会进入到A所在的任务栈中

2.当使用非Activity的Context启动standard模式的Activity的时候会报错们因为standard模式的Activity默认会进入启动它的Activity的任务栈中,由于非Activity类型的Context并没有所谓的任务栈,所以被启动的Activity不知所去

解决办法:为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这时候启动的时候就为他创建了一个新的任务栈,同时这时候实际是以singleTask启动的。

3.singleTop模式启动(栈顶复用模式),若栈顶存在则会调用onNewIntent方法。

4.singleTask(栈内服用模式)是一种单实例模式。在这种模式下,只要被启动的Activity在所需要的任务栈中,那么多次启动都不会创建新的实例,系统会将该Activity所需要的任务栈中在它之上的Activity回退掉,然后调用它的onNewIntent方法。

具体一点就是:A请求B以singleTask的模式启动,系统寻找B所需要入栈的任务栈,若该任务栈存在且任务栈中有B,则回退掉该任务栈中B之上的Activity并调用它的onNewIntent方法,若该任务栈存在但没有B则创建B并将B压入该任务栈,若该任务栈不存在,则创建该任务栈然后创建B并将B压入栈中。

5.singleInstance:单实例模式,加强版的singleTask模式,具有singleTask的全部特性,除此之外以该方式启动的Activity只能单独的存在一个任务栈中

具体:A请求B以singleInstance的方式启动,系统寻找B所在的任务栈,若该任务栈存在(该栈是B独有的,不可能有其他Activity),则复用该Activity(栈内复用性),若不存在则创建该栈并创建B实例压入栈中。除非系统销毁这个独特的任务栈,否则该Activity启动时会一直被复用。

6.所需任务栈的概念:TaskAffinity:任务相关性,这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字都为应用的包名,当然开发中也可以单独指定TaskAffinity属性,属性值不能喝包名相同。TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下意义不大。

7.当TaskAffinity和singleTask启动模式配对使用的时候,它是具有该模式的Activity的当前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中

8.任务栈分W为前台任务栈和后台任务栈,后台任务栈中的activity处于暂停状态,用户可以通过切换将后台任务栈切换到前台。

9.通过标记位设置的Activity启动模式优先级高于清单文件中通过launchMode设置的优先级。

10.allowTaskReparenting:具体例子:应用A和应用B,A中的任意Activity启动了B中的Activity C,C设置了allowTaskReparent为true,A启动B中C的时候,C会运行在A的任务栈中,但是C属于B应用,正常情况下,他的任务栈不可能和A相同(包名不同),所以,B被启动后,B创建了自己的任务栈,这时候系统发现C原本想要的任务栈被创建了,并且allowTaskReparenting为true,所以C从A的任务栈中转移到了B的任务栈中。

11.Activity的Flags:FLAG_ACTIVITY_CLEAR_TOP,具有此标记位置的Activity,当他启动时,在同一个栈中所有位于他上面的Activity都要被出栈,这个模式一般要配合FLAG_ACTIVITY_NEW_TASK配合使用,此时,如果栈中被启动的Activity实例已经存在,那么系统会调用它的onNewIntent,如果被启动的Activity采用standard模式,那么它连同它之上的Activity都要出栈,系统会创建新的Activity示例并放入栈顶。

有不适之处,请留言!小白谢过各路大神!

原创粉丝点击