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