Intent的Flag
http://www.tmooc.cn/player/index.shtml?videoId=75E0CB4D963947888B227794CAD6FBC4&courseId=146B71F361674468892A99F54EDA498C
在Intent中设置Flag:
调用Intent的setFlags()
或addFlags()
可以配置Intent的Flag属性
# FLAG_ACTIVITY_NEW_TASK
尝试开启新的Task,可能产生的效果:
- 如果当前已有Task与尝试激活的Activity的taskAffinity相同,则在该Task中直接压栈,被激活的Activity获得栈顶位置;
- 如果当前没有Task与尝试激活的Activity的taskAffinity相同,则创建新的Task,且被激活的Activity获得栈顶位置。
【例如】:APP1中存在ActivityA与ActivityB,当前ActivityA已经激活,通过APP2 激活APP1的ActivityB,回到桌面并点击APP1的图标,会直接显示ActivityB,在整个过程中,APP1的2个Activity的Task ID相同,APP2的Activity是另一个Task ID。
# FLAG_ACTIVITY_CLEAR_TASK
清空被激活的Activity应该归属的Task,且被激活的Activity添加到该Task中获得栈顶位置。
该Flag应与FLAG_ACTIVITY_NEW_TASK一同使用。
# FLAG_ACTIVITY_SINGLE_TOP
位于栈顶时唯一,其特性可参考将<activity>
中launchMode属性配置为singleTop。
【与SingleTop区别】:如果在Activity中配置,则该Activity一直都是SingleTop,而使用Intent的Flag可以仅在动态使用时为singleTop
# FLAG_ACTIVITY_CLEAR_TOP 清除顶部
可能产生的效果:
【情景1】:当Intent尝试激活的Activity的实例在Task中不存在时,创建该Activity的实例,并获得栈顶位置;
【情景2】:如果该Activity的实例已经存在,则清除Task中该实例之上的所有Activity(效果等同于singleTask),且获得栈顶位置;
【情景3】:在情景2的基础上,如果该Activity的launchMode属性不是singleTask或singleInstance时,该Activity原本存在的实例也会被移除,位于栈顶的是新创建的该Activity的实例。
# FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
当Task被Reset时,清除该Activity及在Task中位于该Activity之上的所有Activity。
当Task被置于后台,且重新被置于前台时,则可能被Reset(由系统添加FLAG_ACTIVITY_RESET_TASK_JF_NEEDED
),通常通过点击应用程序图标回到前台时会Reset,而通过任务列表则不会。
# FLAG_ACTIVITY_NO_HISTORY
当Activity被置于后台之后,是否将其从Back Stack中清除并结束,其特性可参考<activity>
的noHistory属性。