首页 文章

android singleTask活动不作为root?

提问于
浏览
3

我不太理智 . doc表示singleTask活动始终是堆栈的根目录:

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

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

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

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

我还有其他原因吗?

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

1 回答

  • 6

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

    在使用特殊启动模式 singleTasksingleInstance 测试方案时,请注意 taskAffinity 在此行为中起着重要作用,因为 taskAffinity 优先于特殊启动模式 .


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

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

    • 启动应用程序时(假设它当前未运行),Android会创建一个位于前台的新任务,其中包含您启动的应用程序的根活动 .

    • 当该活动开始新活动时,这些新活动将添加到当前任务中(通常,虽然此行为有例外) .

    • 按HOME按钮时,当前任务将从前景移动到后台 .

    • 显示"recents"列表时,显示的是最近任务列表,而不是最近活动列表或最近应用程序列表 .

    • 当您从最近任务列表中选择任务时,如果该任务仍处于活动状态(其中仍包含实时活动),则整个任务(包括其所有活动)将从后台传递到前台 .

    • 任务也可以是"stacked" . 当前任务中的活动在新任务中启动活动时,新任务将堆叠在当前任务之上 . 这仅用于控制新任务完成时发生的情况 . 在通常情况下,当新任务完成(其所有活动都已完成)时,Android将使用户返回上一个任务(即:启动完成任务的任务) .

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

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


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

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

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

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

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

    文档还说:

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

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

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

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

相关问题