如果我的应用程序在后台,为什么 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 A(单击应用程序图标)
- 单击 activity A 屏幕中的按钮以启动 B(现在 activity 堆栈看起来像 A -> B)
- 按主页按钮再次查看应用程序菜单并最小化应用程序
- 再次点击应用图标启动我的应用
结果:打开 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.
我的应用程序有两个活动:A 和 B。A - 是主要的 activity(默认启动),它有操作 android.intent.action.MAIN
和类别 android.intent.category.LAUNCHER
,A activity 已经覆盖了 lanchMode="singleTop"
,这意味着如果我们尝试启动 activity A 而 A 不是任务的顶部,那么 OS 将创建一个新的 A 实例并且放在最上面。
步骤:
- 从应用程序菜单启动 activity A(单击应用程序图标)
- 单击 activity A 屏幕中的按钮以启动 B(现在 activity 堆栈看起来像 A -> B)
- 按主页按钮再次查看应用程序菜单并最小化应用程序
- 再次点击应用图标启动我的应用
结果:打开 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.