如果我的应用在后台,为啥 Android 操作系统不会创建 singleTop 活动的新实例?

Posted

技术标签:

【中文标题】如果我的应用在后台,为啥 Android 操作系统不会创建 singleTop 活动的新实例?【英文标题】:Why Android OS does not create a new instance of an singleTop activity if my app in the background?如果我的应用在后台,为什么 Android 操作系统不会创建 singleTop 活动的新实例? 【发布时间】:2021-02-21 01:48:39 【问题描述】:

我的应用程序有两个活动:A 和 B。A - 是主要活动(默认启动),它有动作 android.intent.action.MAIN 和类别 android.intent.category.LAUNCHER,并且 A 活动已覆盖 lanchMode="singleTop",这意味着如果我们试图启动活动 A 并且 A 不是任务的顶部,然后操作系统将创建一个新的 A 实例并将其放在顶部。

步骤:

从应用菜单启动活动 A(点击应用图标) 单击活动 A 屏幕中的按钮以启动 B(现在活动堆栈看起来像 A -> B) 按主页按钮再次查看应用程序菜单并最小化应用程序 再次单击应用图标以启动我的应用

结果:打开的活动 B(堆栈看起来像 A -> B)

所以我的问题是,如果我的应用在后台的任务堆栈看起来像 A -> B(B 位于顶部,A 和 B 未完成,它们处于 onStop 状态),为什么操作系统不创建 A 的新实例当我从应用程序菜单中点击应用程序图标时,只需打开当前堆栈(点击通过 Launcher 意图将意图发送到我的应用程序,并且 Launcher 在具有启动模式 singleTop 的活动 A 中描述)

我认为它应该打开 A 的新实例(带有堆栈 A -> B -> A),因为 A 有 lanchMode="singleTop"。似乎如果应用程序在后台有活动(在onStop 状态)并且它以与第一次相同的意图打开,那么 Android 操作系统只会显示当前的应用程序任务,但我找不到任何证据。

【问题讨论】:

是的,这是正确的行为,请在此处阅读 Activity 的生命周期:developer.android.com/guide/components/activities/… @ShailendraMadda 谢谢!但是,请您提供一个引用来证明这种行为的证据吗? 当您从 Activity - A 移动到 Activity - B 时,Activity A 将返回堆栈。然后,如果您单击主页按钮,那么您的 Activity-B 仍然存在,对吗?如果您完成活动,那么只有它会启动 Activity-A,否则它会打开最后一个 Activity,在您的情况下是 B。 @ShailendraMadda 是的,我凭经验找到了它,但我需要一些证据来证明这种行为。能否请您提供文档中的报价? 在这里查看:developer.android.com/guide/components/activities/… 【参考方案1】:

此行为实际上与Activity 的启动模式无关。实际上,在这种情况下,Android 不会启动任何Activity。如果您添加日志记录或在onNewIntent() 设置断点,您会看到这一点,在Android 想要启动Activity 的情况下会调用该断点,看到任务中的堆栈顶部已经有一个实例,并且通过调用onNewIntent() 将新的Intent 路由到当前实例。

这里的问题是,当用户点击主屏幕上的应用程序图标时,在启动任何Activity 之前,Android 会查看后台是否已经有一个使用相同@ 启动的任务987654329@(在这种情况下,ACTION=MAIN,CATEGORY=LAUNCHER,COMPONENT=ActivityA)。如果它发现一个以相同的Intent 启动的任务,它只是将该任务以它所处的任何状态带到前台(就像它移动到后台时一样),就是这样。它不会启动任何新的Activity,也不会在最顶层的Activity 上调用onNewIntent()

这是记录在here(虽然很容易错过):它说:

设备主屏幕是大多数任务的起始位置。当。。。的时候 用户触摸应用启动器中的图标(或主页上的快捷方式 屏幕),该应用程序的任务来到前台。如果不存在任务 对于应用程序(该应用程序最近没有使用),那么一个新的任务是 创建并且该应用程序的“主要”活动作为根打开 堆栈中的活动。

【讨论】:

以上是关于如果我的应用在后台,为啥 Android 操作系统不会创建 singleTop 活动的新实例?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的电脑只能运行一个程序

Android O,后台服务运行超过 30 分钟。为啥?

为啥我的 Android 应用程序偶尔会非常快地耗尽电池电量?

防止系统杀死后台应用程序

如何在后台运行android应用程序[重复]

为啥我的 iPhone 应用程序在后台继续运行?