希望有人可以帮助我弄清楚,如果不是解决方案,至少是对行为的解释。
问题:
在某些设备上,按下启动器图标会导致当前任务被恢复,在其他设备上会导致初始启动意图被触发(有效地重新启动应用程序)。为什么会这样?
细节:
当您按下“启动器图标”时,应用程序会正常启动 - 也就是说,我假设会启动一个 Intent,其名称为您的第一个 Activity
操作为 android.intent.action.MAIN
和类别 android.intent.category.LAUNCHER
。然而,情况并非总是如此:
在大多数设备上,如果您在应用程序已经运行后按下启动器图标,则该进程中当前正在运行的 Activity 将恢复( 不是 最初的 Activity
)。它恢复的方式与您从操作系统菜单的“最近的任务”中选择它的方式相同。这是我想要在 所有 设备上的行为。
但是,在选定的其他设备上会发生不同的行为:
在摩托罗拉 Xoom 上,当您按下启动器图标时,应用程序将 始终 启动初始启动
Activity
无论当前正在运行什么。我假设启动器图标总是启动“启动器”意图。在三星 Tab 2 上,当您按下启动器图标时,如果您刚刚安装了该应用程序,它将始终启动初始的
Activity
(与 Xoom 相同) - 但是,在您重启设备后安装,启动器图标将改为恢复应用程序。我假设这些设备在设备启动时将“已安装的应用程序”添加到查找表中,从而允许启动器图标正确恢复正在运行的任务?
我已经阅读了许多 听起来 与我的问题相似的答案,但只是添加 android:alwaysRetainTaskState="true"
或使用 launchMode="singleTop"
到 Activity
不是答案。
编辑:
在最近一次启动这个应用程序后,我们发现在第一次重启后 所有 设备上都开始出现这种行为。这对我来说似乎很疯狂,但通过重启过程,我实际上找不到问题所在。
原文由 Graeme 发布,翻译遵循 CC BY-SA 4.0 许可协议
啊哈! (tldr;见底部粗体的陈述)
我发现了问题……我想。
所以,我将从一个假设开始。当您按下启动器时,它会启动默认的
Activity
或者,如果由先前启动启动的Task
已打开,则会将其置于最前面。换句话说 - 如果在导航的任何阶段您创建新的Task
和finish
旧的,启动器现在将不再恢复您的应用程序。如果这个假设是真的,我很确定这应该是一个错误,因为每个
Task
都在同一个过程中,并且与第一个创建的简历候选人一样有效?然后我的问题是通过从几个
Intents
中删除这些标志来解决的:虽然很明显
FLAG_ACTIVITY_NEW_TASK
创建了一个新的Task
,但我不明白上述假设是否有效。我确实认为这是罪魁祸首并将其删除以进行测试,但我仍然遇到问题,因此我将其驳回。但是,我仍然有以下条件:我的初始屏幕使用上述标志在我的应用程序中启动“主”
Activity
。毕竟,如果我“重新启动”了我的应用程序并且Activity
仍在运行,我宁愿保留它的状态信息。您会在 文档 中注意到它没有提到开始新的
Task
:因此,我遇到了如下所述的情况:
A
推出B
与FLAG_ACTIVITY_CLEAR_TOP
,A
完成—c9797B
希望重新启动服务,因此将用户发送到A
具有服务重新启动逻辑和 UI(无标志)。A
启动B
带有 FLAG_ACTIVITY_CLEAR_TOP,A
完成。在这个阶段,第二个
FLAG_ACTIVITY_CLEAR_TOP
标志正在重新启动B
它在任务堆栈中。我假设这必须破坏Task
并开始一个新的,导致我的问题,如果你问我,这是一个非常难以发现的情况!所以,如果我所有的假设都是正确的:
Launcher
只恢复最初创建的任务FLAG_ACTIVITY_CLEAR_TOP
如果它重新启动唯一剩下的Activity
,也会重新创建一个新的Task