关于Activity的LaunchMode与Flag

LaunchMode
1. standard和singleTop没什么可说的,singleTop需要记住只对当前task有效,支持onNewIntent方法(即不会创建新的activity)。即使两个activity的taskAffinity不同,但如果是standard的launchmode,那他们两个还是在同一个task内(应该taskAffinity是在指定了task后才会生效的)。
2. singleTask,activity在初始化的时候,只有其taskAffinity与当前task的taskAffinity不同的时候,才会新创建一个task;如果有task已经存在该activity的实例,则将该task调到前台,并把该activity之上的所有activity清空(不管是不是当前task),使该activity与用户交互,支持onNewIntent方法。(如果activity的launchMode为singleTask,则在整个系统中,仅会有一个该activity对象存在,该activity不一定在task的栈底)
3. singleInstance,不管与当前task的taskAffinity是否相同,都会新建一个task,而且该task只有它一个activity实例,支持onNewIntent方法,如A -> B -> A ->B(A的launchMode是standard,B的launchMode是singleInstance),其task信息为:task1:A -> task1:A和task2:B -> task1:A,A和task2:B ->  task1:A,A和task2:B。B是同一个实例。
Flag
1. FLAG_ACTIVITY_SINGLE_TOP与launchMode的singleTop效果一样,支持onNewIntent方法。
2. FLAG_ACTIVITY_NEW_TASK是否创建新的task与当前task的taskAffinity有关。
如果当前activity的taskAffinity与当前task的taskAffinity相同:
    1. 当前task里面已经有activity的实例了:
        1.1. 该taskAffinity不是默认的taskAffinity,则创建activity实例不成功(如果activity的taskAffinity属性已经设置,如果当前task存在实例,就不再构造新的)。
(故FLAG_ACTIVITY_NEW_TASK经常与FLAG_ACTIVITY_CLEAR_TOP搭配使用)
        1.2. 该taskAffinity与默认的taskAffinity相同,则这里新创建新的activity实例,入栈。
    2. 当前task里面没有activity的实例,创建新的activity实例,入栈。
如果当前activity的taskAffinity与当前task的taskAffinity不相同:
    1. 存在taskAffinity相同的task:
        1.1.  taskAffinity是默认的(没有指定):创建新的activity实例,入栈。
        1.2.  taskAffinity是非默认的:
             1.2.1. task中已经有该activity的实例了:不会创建新的activity实例,只会调起taskAffinity相同的task到前台,该task的栈顶不一定是该activity的实例。
            (故FLAG_ACTIVITY_NEW_TASK经常与FLAG_ACTIVITY_CLEAR_TOP搭配使用)
             1.2.2. task中没有该activity的实例:创建新的activity实例,入栈。
    2. 不存在taskAffinity相同的task:创建新的task,创建新的activity实例,入栈。

3. FLAG_ACTIVITY_CLEAR_TOP只对当前task有效,所有其和FALG_ACTIVITY_NEW_TASK经常配合使用。但要注意,FLAG_ACTIVITY_CLEAR_TOP不支持onNewIntent方法,比如 A -> B -> A -> B(A是标准模式,B添加了FLAG_ACTIVITY_CLEAR_TOP)的task信息为:task1:A -> task1:A,B -> task1:A,B,A -> task1:A,B。但这个B是新建的实例,而不是原来的实例。但如果同时使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP,则onNewIntent生效。



睡觉,1点了,不早了。

你可能感兴趣的:(关于Activity的LaunchMode与Flag)