android singleTask活动不作为root?

时间:2015-11-26 16:46:54

标签: android launchmode android-task

我一直在阅读关于发布模式的文档,有一点我不敢理解。 doc表示singleTask活动始终是堆栈的根目录:

  

相比之下," singleTask"和" singleInstance"活动只能   开始一项任务。 它们始终位于活动堆栈的根目录。   此外,该设备只能在a处保存一个活动实例   时间 - 只有一个这样的任务。

但是:如果你在this查看文档的Figure 4部分,你会看到当Activity 2启动Activity Y(将该任务置于前台)时,Activity Y已经位于任务,将在当前任务的顶部,而不是根。

我在这个simulation app中尝试了这个场景,当我创建singleTask活动时,它总是创建一个新任务。但是,如果唯一的实例已经存在,则它将完成高于此实例的所有活动,因此唯一的实例可以是根(也是任务中的唯一活动)。

活动Y如何成为活动X上方任务的首位?

我还有其他原因吗?

PS:我也不太了解任务和后台堆栈之间的区别。

1 个答案:

答案 0 :(得分:7)

像往常一样(叹气),文档是错误的。在您引用的图表中,显然,活动Y不能定义为singleTask,而是包含2个活动的后台任务中的顶级活动。

在使用特殊启动模式singleTasksingleInstance测试方案时,请注意taskAffinity在此行为中扮演重要角色,因为taskAffinity优先于特殊启动模式。

关于“任务”和“后台”之间的区别:

“任务”是一组可以作为整个组进行操作的活动。

  • 启动应用程序时(假设它当前未运行),Android会创建一个位于前台的新任务,其中包含您启动的应用程序的根活动。
  • 当该活动开始新活动时,这些新活动将添加到当前任务中(通常,虽然此行为有例外)。
  • 当您按HOME按钮时,当前任务将从前景移动到后台。
  • 当您显示“最近”列表时,显示的是最近任务列表,而不是最近活动列表或最近应用程序列表。
  • 当您从最近任务列表中选择任务时,如果该任务仍处于活动状态(其中仍有活动),则整个任务(包括其所有活动)将从后台传递到前台。
  • 任务也可以“堆叠”。当前任务中的活动在新任务中启动活动时,新任务将堆叠在当前任务之上。这仅用于控制新任务完成时发生的情况。在通常情况下,当新任务完成(其所有活动都已完成)时,Android将使用户返回上一个任务(即:启动完成任务的任务)。

“后台堆栈”通常是指任务中的一组活动。每个任务都有自己的一系列活动。这用于控制当前活动(后端堆栈顶部的活动)完成时发生的情况。通常,Android会将用户返回到直接位于后堆栈中的完成活动(下方)下方的活动。

Android代码和文档通常是指任务的“根”(这是用于启动任务的活动)和任务的“顶部”或“前端”(这是活动)目前正在展示。)

实际上,文档在于:-(这是一个例子:

  

相比之下,“singleTask”和“singleInstance”活动只能   开始一项任务。

这句话通常是,但并不总是正确的。例如,假设我有2项活动:ABA是启动活动(即:具有ACTION=MAINCATEGORY=DEFAULT的活动),并使用标准启动模式定义。 B定义为launchMode="singleTask"。我启动了应用程序,Android创建了A的实例。然后在A我做:

startActivity(new Intent(this, B.class));

这将创建一个新的活动实例B,并将其置于A的同一任务中。 不会以活动B为根创建新任务。原因是活动A和活动B具有相同的taskAffinity(默认情况下,应用程序的所有活动都具有相同的taskAffinity),Android将忽略启动模式在这种情况下为B

文档还说:

  

此外,设备只能在a处保存一个活动实例   时间 - 只有一个这样的任务。

同样,taskAffinity可以打破这种行为。再次假设我们ABC都具有相同(默认)taskAffinityAC具有标准启动模式,B具有launchMode="singleTask"。如果A启动BB的实例最终不会出现在新任务中,而是与A相同的任务(见上文)。现在B开始C。 Android会创建C的实例,并将其置于B的同一任务中。现在C来电:

startActivity(new Intent(this, B.class));

Android会创建B的新实例,并将其置于任务中的C之上。现在有2个B个实例,它们都不是任务的根活动!这种行为也是由于taskAffinity胜过启动模式。