设置此状态,记住如下原则,首先会查找是否存在和被启动的Activity具备相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性同样,因此下面的a状况会在同一个栈中,前面这句话有点拗口,请多读几遍),若是有,刚直接把这个栈总体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,若是没有,则新建一个栈来存放被启动的activity.net
前提: Activity A和Activity B在同一个应用中.对象
操做: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B, 启动Activity B的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK, Activity B被压入Activity A所在堆栈(堆栈状态: AB).blog
缘由: 默认状况下同一个应用中的全部Activity拥有相同的关系(taskAffinity).图片
前提: Activity A在名称为"TaskOne应用"的应用中, Activity C和Activity D在名称为"TaskTwo应用"的应用中.开发
操做1: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),在Activity A中启动Activity C, 启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C),长按Home键, 选择TaskA, Activity A回到前台, 再次启动Activity C(两种状况1.从桌面启动;2.从Activity A启动,两种状况同样), 这时TaskB回到前台, Activity C显示, 供用户使用, 即: 包含FLAG_ACTIVITY_NEW_TASK的Intent启动Activity的Task正在运行, 则不会为该Activity建立新的Task,而是将原有的Task返回到前台显示.get
操做2: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C),在Activity C中启动Activity D(TaskB的状态: CD) 长按Home键, 选择TaskA, Activity A回到前台, 再次启动Activity C(从桌面或者ActivityA启动,也是同样的), 这时TaskB回到前台, Activity D显示,供用户使用.说明了在此种状况下设置FLAG_ACTIVITY_NEW_TASK后,会先查找是否是有Activity C存在的栈,根据亲和性(taskAffinity),若是有,刚直接把这个栈总体移动到前台,并保持栈中的状态不变,即栈中的顺序不变it
前提: Activity A, Activity B, Activity C和Activity D在同一个应用中.email
操做: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 在Activity B中启动Activity C(堆栈状态: ABC), 在Activity C中启动Activity D(堆栈状态: ABCD), 在Activity D中启动Activity B,启动Activity B的Intent的Flag设置为FLAG_ACTIVITY_CLEAR_TOP, (堆栈状态: AB).请求
前提: Activity A在名称为"TaskOne应用"的应用中, Activity C和Activity D在名称为"TaskTwo应用"的应用中.程序
操做: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A), 在Activity A中启动Activity C,启动Activity C的Intent的Flag设为FLAG_ACTIVITY_NEW_TASK,Android系统会为Activity C开僻一个新的Task, 命名为TaskB(TaskB堆栈状态: C), 在Activity C中启动Activity D(TaskB的堆栈状态: CD), 长按Home键, 选择TaskA, Activity A回到前台, 在Activity A中再次启动Activity C,在启动Activity C的Intent中设置Flag为FLAG_ACTIVITY_BROUGHT_TO_FRONT, TaskB回到前台, Activity C显示, (TaskB的堆栈状态: C).
(与FLAG_ACTIVITY_NEW_TASK结合使用)
在当前的Task堆栈中设置一个还原点,当带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求启动这个堆栈时(典型的例子是用户从桌面再次启动这个应用),还原点之上包括这个应用将会被清除。
应用场景: 在email程序中预览图片时,会启动图片观览的actvity,当用户离开email处理其余事情,而后下次再次从home进入email时,咱们呈现给用户的应该是上次email的会话,而不是图片观览,这样才不会给用户形成困惑。
例: 存在Activity A, Activity B, Activity C, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A), 在Activity A中启动Activity B(TaskA堆栈状态: AB), 接着Activity B启动Activity C(TaskA堆栈状态: ABC), 启动Activity C的Intent中设置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标题, 这样TaskA中有一个还原点,当有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求TaskA堆栈时(好比请求Activity A)系统就会将还原点以上的Activity清除, TaskA堆栈中只剩下了AB.
若是启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中, 若是设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明。
"launchMode"设置为"standard"的 Activity能够被实例化屡次, 能够在Task中的任何位置, 对于一个新的Intent请求就会实例化一次.
若是启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中, 若是设置了Activity请参考上面FLAG_ACTIVITY_NEW_TASK的詳細说明,
"launchMode"设置为"singleTop"的Activity能够被实例化屡次, 能够在Task中的任何位置, 对于一个新的Intent请求若是在Task栈顶, 则会用栈顶的Activity响影Intent请求,而不会从新实例化对象接收请求, 若是没有在栈顶, 则会实例化一个新的对象接收Intent请求.
设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务存在;若是存在这样的任务,它就会在这个任务中启动,不然就会在新任务中启动。所以,若是咱们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
若是设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,若是存在,就会把位于这个Activity实例上面的Activity所有结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。
参考: 解开Android应用程序组件Activity的"singleTask"之谜https://blog.csdn.net/luoshengyang/article/details/6714543
launchMode"设置为"singleInstance"的Activity老是在栈底, 只能被实例化一次, 不容许其它的Activity压入"singleInstance"的Activity所在Task栈, 即整个Task栈中只能有这么一个Activity.
taskAffinity属性应和FLAG_ACTIVITY_NEW_TASK标志及allowTaskReparenting属性结合使用, 若是只使用taskAffinity属性,请参考上面Task默认的行为.
前题: Activity A和Activity B在同一个应用中, Activity A与Activity B设置不一样的taskAffinity属性.
前题: Activity A在"TaskOne应用"中, Activity C在"TaskTwo应用"中, Activity A和ActivityC设置了相同的taskAffinity属性.
若是Task堆栈中的Root Activity设置了此属性值为true, 无论出现任何状况, 一直会保留Task栈中Activity的状态.
若是Task堆栈中的Root Activity设置了此属性值为true, 只要你一离开这个Task栈, 则系统会立刻清理除了Root Activity的所有Activity.
若是某Activity设置了finishOnTaskLaunch属性, 只要你一离开这个Task栈, 则系统会立刻清除这个Activity,无论这个Activity在堆栈的任何位置.