安卓单任务活动不作为根



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

相比之下,"单任务"和"单实例"活动只能 开始一项任务。它们始终位于活动堆栈的根目录。 此外,设备只能容纳一个活动实例 时间——只有一项这样的任务。

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

我在此模拟应用程序中尝试了此方案,当我创建单个任务活动时,它总是创建一个新任务。但是,如果唯一的实例已存在,它将完成此实例上方的所有活动,因此唯一的实例可以是根实例(也是任务中的唯一活动(。

活动 Y 如何位于活动 X 之上的任务之上?

我失踪还有其他原因吗?

PS:我也不是真的不明白任务和后退堆栈之间的区别。

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

在测试具有特殊启动模式singleTasksingleInstance的场景时,请注意taskAffinity在此行为中起着重要作用,因为taskAffinity优先于特殊启动模式。


关于"任务"和"后退堆栈"之间的区别:

"任务"是可以作为一个整体进行操作的活动堆栈。

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

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

Android 代码和文档通常是指任务的"根"(这是用于启动任务的活动(和任务的"顶部"或"前端"(这是当前正在显示的活动(。


实际上,文档是:-(下面是一个示例:

相比之下,"单任务"和"单实例"活动只能 开始一项任务。

这种说法通常是,但并不总是正确的。例如,假设我有 2 个活动:ABA是启动活动(即:具有ACTION=MAINCATEGORY=DEFAULT的活动(,并使用标准启动模式定义。 BlaunchMode="singleTask" 定义。我启动应用程序,安卓创建了一个A实例。在A中,我接着做:

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

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

文档还说:

此外,设备只能容纳一个活动实例 时间——只有一项这样的任务。

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

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

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

相关内容

  • 没有找到相关文章

最新更新