我正在查看单个实例的文档,并尝试了一些示例。 在我的一个样本中,我有三个活动:A-> B-> C, 其中B在清单中有 android:launchMode =" singleInstance" 。活动A和C具有默认启动模式。
情境:
在通过A和B(即A-> B-> C)导航到C之后,从活动C按下后退按钮进入活动A(C-> A),但是从活动A按下后退按钮不要退出应用程序,而是将活动B放在前面,然后从活动B按回按钮退出应用程序。
问题
为什么当从活动A按下后退按钮时,活动B会到达前景?
其他情况:
类似地,如果用户按下设备主页按钮,则从活动C开始,并通过长按主页回来应用程序,C保持在前台。但后按钮按压流程采用C-> A - >退出应用程序。这次活动B没有出现在前台。
答案 0 :(得分:27)
从 A-> B 导航后,您有2个任务:第一个包含 A ,第二个包含 B 。 B 位于顶部, A 低于此值。
现在当从B-> C导航时,Android会将活动C启动到包含A的任务中(它无法将其启动到包含B的任务中,因为B被定义为“singleInstance”,因此它会启动它进入一个具有相同“taskAffinity”的任务,在这种情况下包含A)的任务。为此,Android将包含A的任务带到了前面。现在你有2个任务:前面包含A和C的任务,第二个包含B的任务。
现在按下BACK键,完成活动C并返回到任务下面的活动,即C.你还有2个任务:前面有一个C,下面有一个B。
现在再次按BACK键。这将完成活动A(从而完成持有A的任务)并将任务堆栈中的上一个任务带到前面,即包含B的任务。您现在有1个任务:包含B的任务。
在其他方案中,从 A-> B-> C 导航后,您将从2个任务开始:前面包含A和C的任务,第二个包含B的那个。
现在按HOME按钮。你现在说你“长按”回到应用程序。这不完全正确。你不能“回到应用程序”。你只能“回到任务”。但是你有两个不同的任务:如果长按,你应该看到2个任务。它们可能具有相同的图标(除非您为活动B提供了不同的图标),因此您可能无法区分它们。如果您选择包含A和C的任务,那么该任务将被带到前面,活动C位于顶部。如果现在按BACK键,活动C将完成,其下的活动将显示活动A.如果现在再次按BACK键,活动A将完成,您将返回到HOME屏幕。包含B的任务仍在最近任务列表中,但在其他任务下不再位于任务堆栈中,因为当您按 HOME按钮时,它就像回到零。你重新开始。您没有活动任务,因此所有任务都在一行中,它们不在堆栈中且没有层次结构。
此外,在您的问题中,您使用短语“退出应用”。这也不太正确。 BACK按钮按下的唯一功能是完成当前活动。如果当前活动是任务中的唯一活动,则它也会完成该任务。但是,它并没有“退出应用程序”。特别是在您的情况下,因为您的“app”实际上存在于两个单独的任务中。
希望这很清楚。
答案 1 :(得分:1)
来自doc
“singleInstance”活动只能开始一项任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例 - 只有一个这样的任务。
另一方面,“singleInstance”活动不允许其他任何活动成为其任务的一部分。这是任务中唯一的活动。如果它启动另一个活动,则该活动将分配给其他任务