应用程序重新启动而不是恢复

新手上路,请多包涵

希望有人可以帮助我弄清楚,如果不是解决方案,至少是对行为的解释。

问题:

在某些设备上,按下启动器图标会导致当前任务被恢复,在其他设备上会导致初始启动意图被触发(有效地重新启动应用程序)。为什么会这样?

细节:

当您按下“启动器图标”时,应用程序会正常启动 - 也就是说,我假设会启动一个 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 许可协议

阅读 510
2 个回答

啊哈! (tldr;见底部粗体的陈述)

我发现了问题……我想。

所以,我将从一个假设开始。当您按下启动器时,它会启动默认的 Activity 或者,如果由先前启动启动的 Task 已打开,则会将其置于最前面。换句话说 - 如果在导航的任何阶段您创建新的 Taskfinish 旧的,启动器现在将不再恢复您的应用程序。

如果这个假设是真的,我很确定这应该是一个错误,因为每个 Task 都在同一个过程中,并且与第一个创建的简历候选人一样有效?

然后我的问题是通过从几个 Intents 中删除这些标志来解决的:

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

虽然很明显 FLAG_ACTIVITY_NEW_TASK 创建了一个新的 Task ,但我不明白上述假设是否有效。我确实认为这是罪魁祸首并将其删除以进行测试,但我仍然遇到问题,因此我将其驳回。但是,我仍然有以下条件:

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

我的初始屏幕使用上述标志在我的应用程序中启动“主” Activity 。毕竟,如果我“重新启动”了我的应用程序并且 Activity 仍在运行,我宁愿保留它的状态信息。

您会在 文档 中注意到它没有提到开始新的 Task

如果设置,并且正在启动的活动已经在当前任务中运行,那么不会启动该活动的新实例,而是关闭它上面的所有其他活动,并且此 Intent 将被传递到(现在顶部)作为新意图的旧活动。

例如,考虑一个由以下活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 并带有一个解析为活动 B 的组件的 Intent,那么 C 和 D 将完成并且 B 接收给定的 Intent ,导致堆栈现在是:A,B。

上面示例中当前运行的活动 B 实例将在其 onNewIntent() 方法中接收您在此处启动的新意图,或者自身完成并使用新意图重新启动。如果它已声明其启动模式为“多重”(默认)并且您没有在同一意图中设置 FLAG_ACTIVITY_SINGLE_TOP,那么它将完成并重新创建;对于所有其他启动模式,或者如果设置了 FLAG_ACTIVITY_SINGLE_TOP,则此 Intent 将被传递到当前实例的 onNewIntent()。

这种启动模式也可以与 FLAG_ACTIVITY_NEW_TASK 结合使用,效果很好:如果用于启动任务的根活动,它将将该任务的任何当前正在运行的实例带到前台,然后将其清除为根状态。这尤其有用,例如,当从通知管理器启动活动时。

因此,我遇到了如下所述的情况:

  • A 推出 BFLAG_ACTIVITY_CLEAR_TOP , A 完成—c9797
  • B 希望重新启动服务,因此将用户发送到 A 具有服务重新启动逻辑和 UI(无标志)。
  • A 启动 B 带有 FLAG_ACTIVITY_CLEAR_TOP, A 完成。

在这个阶段,第二个 FLAG_ACTIVITY_CLEAR_TOP 标志正在重新启动 B 它在任务堆栈中。我假设这必须破坏 Task 并开始一个新的,导致我的问题,如果你问我,这是一个非常难以发现的情况!

所以,如果我所有的假设都是正确的:

  • Launcher 只恢复最初创建的任务
  • FLAG_ACTIVITY_CLEAR_TOP 如果它重新启动唯一剩下的 Activity ,也会重新创建一个新的 Task

原文由 Graeme 发布,翻译遵循 CC BY-SA 3.0 许可协议

在我的 Cat s60 上,我在开发者选项中启用了“不保留活动”,再次禁用它可以让我切换应用程序而不会丢失应用程序的状态……

原文由 ptp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏