Intent 启动Activity的各种FLAG解析
一、与Activity启动行为相关的就是它的启动模式,Standard、SingleTop、SingleTask、SingleInstance
standard mode
标准模式,启动直接加到栈顶,销毁后移除。
singletop mode
栈顶唯一,如果栈顶存在就不会重复启动,保证栈顶不会有两个相同的Activtiy
singletask mode
栈内唯一,如果栈内存在,再次启动时会自动把它上面的其他Activity全部清除(调用onDestroy)
singleinstance mode
独占一栈,启动时会建立新栈切换过去,如果启动了普通Activity又会切换回原来的共享栈(新栈仍然存在,会在栈内唯一的Activity结束时关闭)
二、复杂的控制Activity行为的方式,给启动Activity的Intent添加flag,使用 Intent.addFlags(int flags)
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT, Intent.FLAG_ACTIVITY_CLEAR_TASK, Intent.FLAG_ACTIVITY_CLEAR_TOP, Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, Intent.FLAG_ACTIVITY_FORWARD_RESULT, Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY, Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT, Intent.FLAG_ACTIVITY_MULTIPLE_TASK, Intent.FLAG_ACTIVITY_NEW_DOCUMENT, Intent.FLAG_ACTIVITY_NEW_TASK, Intent.FLAG_ACTIVITY_NO_ANIMATION, Intent.FLAG_ACTIVITY_NO_HISTORY, Intent.FLAG_ACTIVITY_NO_USER_ACTION, Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT, Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED, Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS, Intent.FLAG_ACTIVITY_SINGLE_TOP, Intent.FLAG_ACTIVITY_TASK_ON_HOME,
1. FLAG_ACTIVITY_CLEAR_TASK
1. 本flag能造成在新活动启动前,与新活动关联的任务被清空。也就是说,新活动成为新任务的根,旧的活动都被结束了。本flag只能与FLAG_ACTIVITY_NEW_TASK联合使用。
2. FLAG_ACTIVITY_CLEAR_TOP
1. 新活动已在当前任务中时,在新活动上面的活动会被关闭,新活动不会重新启动,只会接收new intent。
2. 新活动已在任务最上面时:如果启动模式是"multiple" (默认的),并且没添加FLAG_ACTIVITY_SINGLE_TOP,那么活动会被销毁重新创建;如果启动模式是其他的,或者添加了FLAG_ACTIVITY_SINGLE_TOP,那么只会调用活动的onNewIntent()。
3. 跟FLAG_ACTIVITY_NEW_TASK联合使用效果很好:如果用于启动一个任务中的根活动,会把该任务移到前面并清空至root状态。这特别有用,比如用于从notification manager中启动活动。
3. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
已废弃。API 21后用FLAG_ACTIVITY_NEW_DOCUMENT。
4. FLAG_ACTIVITY_MULTIPLE_TASK
1. 用于创建一个新任务,并启动一个活动放进去;
总是跟FLAG_ACTIVITY_NEW_DOCUMENT或者FLAG_ACTIVITY_NEW_TASK一起使用;
单独用FLAG_ACTIVITY_NEW_DOCUMENT或者FLAG_ACTIVITY_NEW_TASK时,会在已存在的任务中寻找匹配的Intent,找不到才会创建一个新任务;
使用了本flag不会寻找匹配的Intent,无条件创建一个新任务。
- 用了FLAG_ACTIVITY_NEW_TASK就不要用本flag,除非你启动的是应用的launcher。 跟FLAG_ACTIVITY_NEW_TASK联合使用能防止把已存在的任务移到前面,会为新活动创建一个新任务,无论已存在的任务中有没有新活动。
- 因为默认安卓系统中没有提供可视化的任务管理,所以你不应该使用本flag,除非给用户提供可以回到其他任务的方法。
- 单独用本flag而不用FLAG_ACTIVITY_NEW_DOCUMENT或者FLAG_ACTIVITY_NEW_TASK是无效的。
5. FLAG_ACTIVITY_NEW_DOCUMENT
1. 本flag会给启动的活动开一个新的任务记录。使用了本flag或documentLaunchMode属性时,相同活动的多实例会在最近任务列表中产生不同的记录。
2. 使用本flag比使用documentLaunchMode属性更好,因为documentLaunchMode属性会跟活动绑定,而flag只在需要时添加。
3. 注意本flag的默认词义,活动销毁后最近任务列表中的入口不会移除。这跟使用FLAG_ACTIVITY_NEW_TASK不一样,后者活动销毁后入口会马上移除。你可以用FLAG_ACTIVITY_RETAIN_IN_RECENTS改变这个行为。
4. 本flag可以跟FLAG_ACTIVITY_MULTIPLE_TASK联合使用。单独使用时跟manifest活动中定义documentLaunchMode="intoExisting"效果相同,联合使用时跟manifest活动中定义documentLaunchMode="always"效果相同。
6. FLAG_ACTIVITY_NEW_TASK
1. 新活动会成为历史栈中的新任务(一组活动)的开始。
2. 通常用于具有"launcher"行为的活动:让用户完成一系列事情,完全独立于之前的活动。
3. 如果新活动已存在于一个为它运行的任务中,那么不会启动,只会把该任务移到屏幕最前。
4. 如果新活动要返回result给启动自己的活动,就不能用这个flag。
7. FLAG_ACTIVITY_NO_ANIMATION
1. 本flag会阻止系统展示活动的当前状态到另一个状态之间的转移动画。这并不意味着永远没有动画 -- 如果另一项活动的改变在当前展示的活动启动前发生并且没有使用本flag,那么动画还会展示。当你要进行一系列活动操作,但是用户看到的动画不应该由第一项改变来驱动,而是由下一项。
8. FLAG_ACTIVITY_NO_HISTORY
1. 新活动不会保留在历史栈中,一旦用户切换到其他页面,新活动会马上销毁。
2. 旧活动的onActivityResult()方法永远不会被触发。
9. FLAG_ACTIVITY_REORDER_TO_FRONT
1. 如果新活动已在任务中,用本flag启动会将它移到任务的历史栈的前面。
2. 如果用了FLAG_ACTIVITY_CLEAR_TOP,本flag就无效。
10. FLAG_ACTIVITY_RETAIN_IN_RECENTS
1. 默认情况下由FLAG_ACTIVITY_NEW_DOCUMENT创建的新纪录,用户关闭时(按返回键或其他方式结束)它在最近任务中的入口会被移除。如果你想保留入口,就用本flag。
2. 接收的活动可以用autoRemoveFromRecents属性或者调用Activity.finishAndRemoveTask()来覆盖本请求。
11. FLAG_ACTIVITY_SINGLE_TOP
1. 新活动已存在历史栈的顶端时就不会重新启动。
12. FLAG_ACTIVITY_FORWARD_RESULT
1. (当前活动由源活动启动)本intent从当前活动启动新活动时,源活动的接收目标会从当前活动转移为新活动。新活动调用setResult的数据会传送给源活动。
13. FLAG_ACTIVITY_PREVIOUS_IS_TOP
1. 本intent从当前活动启动新活动时,当前活动不会被视为顶端活动,不管是决定传intent给顶端还是启动新活动。新活动被当做顶端活动使用,假设当前活动立即销毁了。
14. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
1. 新活动不会保存在最近启动的活动列表中。
15. FLAG_ACTIVITY_BROUGHT_TO_FRONT
1. 本flag一般不由应用代码设置,singleTask模式时系统会给你设置。
16. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
1. 新活动在新任务中启动或者被放到一个已存在任务的顶端时,会被当做任务的前门来启动。这会导致任何相关性的活动在适当状态下需要拥有这个任务(无论移动活动到它里面或者是移走),或者在需要时简单地重置任务到初始状态。
17. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
1. 本flag一般不由应用代码设置,活动从历史栈中启动(长按home键)时系统会给你设置。
18. FLAG_ACTIVITY_NO_USER_ACTION
1. 本flag会阻止当前最前面活动的onUserLeaveHint回调,在它被新启动的活动造成paused状态时。
2. 通常,一个活动在受到用户操作而从前面移走的时候会调用上面的回调。该回调标志着活动生命周期中的一个点,在该点活动会隐藏它想要显示的”直到用户看到“的东西,比如闪烁的LED灯。
3. 如果一个活动曾经由非用户驱动的事件比如来电或闹钟启动,应该在startActivity中添加本flag,以保证暂停时活动知道用户并没有看到通知。
19. FLAG_ACTIVITY_TASK_ON_HOME
1. 本flag会造成新的启动任务放在当前主页活动任务(如果有的话)的顶端。也就是说,在任务中按返回键总是会回到主页,即使上一个用户看到的活动不是主页。本flag只能与FLAG_ACTIVITY_NEW_TASK联合使用。
20. FLAG_ACTIVITY_LAUNCH_ADJACENT
1. 本flag只在分屏多窗口模式下使用。新活动会显示在旧活动旁边。本flag只能跟FLAG_ACTIVITY_NEW_TASK联合使用。并且如果你想创建一个已存在活动的新实例,那么要设置FLAG_ACTIVITY_MULTIPLE_TASK。
本文出自 码农,转载时请注明出处及相应链接。
发表评论