android singleTask活动不作为root?

Tom*_*ask 4 android launchmode android-task

我一直在阅读有关发射模式的文档,有一点我没有理解.该文档说singleTask活动始终是堆栈的根:

相比之下,"singleTask"和"singleInstance"活动只能开始一项任务.它们始终位于活动堆栈的根部.此外,设备一次只能保存一个活动实例 - 只有一个这样的任务.

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

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

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

我还有其他原因吗?

PS:我也不太了解Task和后台堆栈之间的区别.

Dav*_*ser 7

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

当有特殊启动模式测试情景singleTask,并singleInstance请注意,taskAffinity扮演这一行为的重要作用,taskAffinity在特殊模式启动优先.


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

"任务"是一组可以作为整个组进行操作的活动.

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

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

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


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

相比之下,"singleTask"和"singleInstance"活动只能开始一项任务.

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

startActivity(new Intent(this, B.class));
Run Code Online (Sandbox Code Playgroud)

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

文件还说:

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

再次,taskAffinity可以打破这种行为.再假设我们拥有A,B并且C都具有相同的(默认)taskAffinity.AC有标准的发射模式,BlaunchMode="singleTask".如果A启动B,则实例B最终不在新任务中,而是在同一任务中A(见上文).现在B开始C.Android会创建一个实例,C并将其放在B同一个任务的顶部.现在C打电话:

startActivity(new Intent(this, B.class));
Run Code Online (Sandbox Code Playgroud)

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

  • 我无法在同一任务中使用 launchMode="singleTask" 的同一 Activity 的两个(或更多)实例来重现该情况。启动一个堆栈中已经有一个实例的新实例只会打开现有的 Activity,同时清除堆栈的顶部。所有活动的任务亲和力都是相同的。 (2认同)