5

我一直在阅读有关启动模式的文档,但有一件事我不明白。该文档说 singleTask 活动始终是堆栈的根:

相反,“singleTask”和“singleInstance”活动只能开始一个任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例——只有一个这样的任务。

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

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

Activity Y 怎么会在 Activity X 之上的任务之上呢?

我失踪还有其他原因吗?

PS:我也不太了解Task和back stack之间的区别。

4

1 回答 1

10

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

singleTask在使用特殊启动模式和测试场景时singleInstance,请注意它taskAffinity在此行为中起着重要作用,因为taskAffinity它优先于特殊启动模式。


关于“任务”和“回栈”的区别:

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

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

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

Android 代码和文档经常提到任务的“根”(这是用于启动任务的 Activity)和任务的“顶部”或“前端”(这是当前显示的 Activity )。


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

相反,“singleTask”和“singleInstance”活动只能开始一个任务。

这种说法通常是正确的,但并不总是正确的。例如,假设我有 2 个活动:AB. A是启动活动(即:带有ACTION=MAIN和的活动CATEGORY=DEFAULT),并使用标准启动模式定义。B用 定义launchMode="singleTask"。我启动应用程序,Android 创建一个A. 然后我A做:

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

这将创建一个新的活动实例B并将其放在A同一任务的顶部。它不会创建以活动B为根的新任务。原因是activityA和activityB一样taskAffinity(默认情况下一个应用的所有activity都一样taskAffinity),Android会忽略B这种情况下的启动模式。

该文件还说:

此外,设备一次只能保存一个活动实例——只有一个这样的任务。

再次,taskAffinity可以打破这种行为。再次假设我们有A,BC, 都具有相同的 (默认) taskAffinityAC具有标准启动模式,B具有launchMode="singleTask". 如果Astarts B,则 的实例不会在新任务中结束,而是在与(见上文)B相同的任务中。A现在B开始C。Android 创建一个实例C并将其放在B同一个任务的顶部。现在C调用:

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

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

于 2015-11-26T17:30:50.010 回答