【问题标题】:Android: Launch mode 'single instance'Android:启动模式“单实例”
【发布时间】:2013-06-27 07:47:07
【问题描述】:

我正在浏览单个实例的文档并尝试了几个示例。 在我的一个示例中,我有三个活动: 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 -> 退出应用程序。这次 Activity B 没有出现在前台。

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    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 个单独的任务中。

    希望这很清楚。

    【讨论】:

    • 非常感谢大卫..您的回答非常清楚地解释了这个概念,真的很有帮助:) 只是为了添加更多细节,我在同一个应用程序中进行了所有这三个活动 A、B 和 C。在长时间的主页上,我看不到两个单独的任务,而只有一个。同样关于 OTHER SCENARIO,“如果您现在再次按 BACK 键,则活动 A 将完成,您将返回主屏幕。” 问: 为什么不让我们执行任务包含 B,因为包含 B 的任务应该在包含 A 和 C 的任务之下,对吧?如果我错了,请纠正我。
    • 请发布您的清单,然后我可以为您提供更多帮助。只需将其作为编辑添加到您的问题中即可。
    • 嘿Pravy,你的困惑终于解决了吗?为什么它不带我们执行包含 B 的任务?我也有同样的困惑。如果你知道,请告诉我。谢谢。
    • @CodeAlien 我认为我的解释很清楚。如果您仍然感到困惑,您应该打开另一个问题。
    • @DavidWasser 很抱歉在评论中打扰您。我遇到了这样的问题:使用android系统的安装程序安装我的应用程序后,我直接从安装程序打开我的应用程序。它运作良好。但是如果我点击应用程序的启动器重新进入它,问题就发生了。这与从 android studio 或 eclipse 安装应用程序不同。每次都从第一个活动开始。为什么会这样?如果我杀死了该应用程序,并且只是单击图标而不是从安装程序进入。它也很好用。这真的让我很困惑。感谢您的帮助。
    【解决方案2】:

    来自doc

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

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

    【讨论】:

    • :感谢您的回复,您的第一点说明了为什么它再次出现在前台。我需要进一步澄清活动堆栈、各种任务和单个活动之间的关系。根据我对您回复的理解,操作系统维护一个称为“活动堆栈”的堆栈,其中包含任务堆栈,而这些任务(即单个任务)将包含活动。如果任何活动被创建为单个实例,那么它将被创建为单独的任务,该任务将被放置在堆栈的底部。请告诉我我的理解是否正确。
    • @Pravy .. 你的理解与我的一致 :) .. .. 如果一个活动正常启动(不是单实例或单任务),那么它只是被推入堆栈
    • 嗯,谢谢.. 但是当用户从活动 C 中按下设备主页按钮时,同样的行为会有所不同。我已经在其他场景中更新了它。我可以知道可能是什么原因吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多