如果我的应用程序在后台,为什么 Android OS 不创建 singleTop activity 的新实例?

Why Android OS does not create a new instance of an singleTop activity if my app in the background?

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

步骤:

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

所以我的问题是,为什么 OS 如果我的应用程序在后台任务堆栈看起来像 A -> B(B 放在最上面,A 和 B 未完成,它们处于 onStop 状态),当我从应用程序菜单中点击应用程序图标时,只需打开当前堆栈(点击将意图发送到我的带有启动器意图的应用程序,启动器在 activity A 中描述,它具有启动模式 singleTop)

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

此行为实际上与 Activity 的启动模式无关。实际上,在这种情况下,Android 没有启动任何 Activity。如果你在 onNewIntent() 添加日志记录或设置断点,你会看到这个,如果 Android 想要启动 Activity,就会调用断点,看到上面已经有一个实例任务中的堆栈,并通过调用 onNewIntent().

将新的 Intent 路由到当前实例

这里的 haooening 是什么,当用户点击主屏幕上的应用程序图标时,在启动任何 Activity 之前,Android 查看是否已经有任务在以相同 Intent 开始的背景(在本例中,ACTION=MAIN,CATEGORY=LAUNCHER,COMPONENT=ActivityA)。如果它找到一个以相同 Intent 开始的任务,它只是将该任务以其所处的任何状态(与它移至后台时的状态完全相同)带到前台,仅此而已。它不会启动任何新的 Activity,它不会在最上面的 Activity.

上调用 onNewIntent()

这已记录在案 here(尽管很容易遗漏):它说:

The device Home screen is the starting place for most tasks. When the user touches an icon in the app launcher (or a shortcut on the Home screen), that app's task comes to the foreground. If no task exists for the app (the app has not been used recently), then a new task is created and the "main" activity for that app opens as the root activity in the stack.