18

我正在浏览单个实例的文档并尝试了几个示例。在我的一个示例中,我有三个活动: A->B->C ,其中 B 在清单中有android:launchMode="singleInstance"。Activity A 和 C 具有默认启动模式。

设想:

通过 A 和 B(即 A->B->C)导航到 C 后,从 Activity C 按下后退按钮会转到 Activity A(C->A),但从 Activity A 按下后退按钮不会退出应用程序,而是将 Activity B 带到前面,然后从 Activity B 按下后退按钮退出应用程序。

问题

为什么从 Activity A 按下后退按钮时 Activity B 会进入前台?

其他场景:

同样,如果用户在 Activity C 中按下设备 Home 按钮,并通过长按 Home 键返回应用程序,C 将停留在前台。但是后退按钮按下流程需要 C-> A -> 退出应用程序。这次活动 B 没有出现。

4

2 回答 2

35

A->B导航后,您有 2 个任务:第一个包含A,第二个包含BB在上面,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 个不同的任务:如果您长按,您应该会看到 2 个任务。它们可能具有相同的图标(除非您为活动 B 提供了不同的图标),因此您可能无法区分它们。如果您选择包含 A 和 C 的任务,则该任务将被带到最前面,活动 C 位于顶部。如果您现在按 BACK 键,活动 C 将完成,其下的活动将显示活动 A。如果您现在再次按 BACK 键,则活动 A 将完成,您将返回主屏幕。包含 B 的任务仍在最近任务列表中,但它不再在您的其他任务下的任务堆栈中,因为当您按下HOME 按钮时这就像回到零。你重新开始。您没有活动任务,因此所有任务都排成一行,它们不在堆栈中,也没有层次结构。

此外,在您的问题中,您使用“退出应用程序”这个短语。这也不完全正确。按下 BACK 按钮的唯一作用是完成当前活动。如果当前活动是任务中的唯一活动,它也会完成该任务。但是,它不会“退出应用程序”。特别是在您的情况下,因为您的“应用程序”实际上存在于 2 个单独的任务中。

希望这很清楚。

于 2013-06-27T18:50:19.200 回答
2

文档

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

  2. 另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动将分配给不同的任务

于 2013-06-27T07:55:57.430 回答