商店后使用启动器时如何防止应用重启?

How to prevent app restart when using launcher after store?

我的 Android 应用程序在使用应用程序商店启动后使用启动器启动它时正在重新启动(反之亦然)。有什么办法可以防止这种情况吗?

重新启动是指 activity 堆栈丢失了。这一点很重要,因为我们的用户会在一个小时左右的时间内间歇性地在应用程序中设置和返回 activity。首次安装后,他们可能会从应用商店安装并打开应用,进行自我设置,然后将应用设置为后台。稍后他们可能会从启动器打开应用程序并丢失所有状态!

随着我们启动前台服务以及设置 activity,问题变得更加复杂。单击服务通知应将用户带回设置 activity 但是,与启动器一样,如果用户最初从 Play 商店打开应用程序,他们将再次失去所有状态!

重现问题

我在这里制作了一个示例应用程序:

https://github.com/samskiter/LaunchTest

注意:它使用 BBC 天气应用程序包 Id,以便您可以从应用商店快速打开(如果安装了此应用程序,"Open" 按钮将显示在 BBC 天气应用程序上)。

步骤如下:

  1. 卸载 BBC 天气应用程序(如果有)
  2. 安装 LaunchTest 应用程序
  3. 从最近关闭 LaunchTest 应用程序
  4. 从 Play 商店的 BBC 天气应用页面打开 LaunchTest 应用
  5. 单击按钮导航到 第二个 activity
  6. 后台应用程序(按主页)
  7. 从应用程序启动器打开 LaunchTest 应用程序
  8. 状态丢失!你回到了 First (root) activity

我试过的

使用 singleTask 启动模式没有帮助 - 即使您每次都使用启动器,它也会导致应用程序重新启动。

我试过了 alwaysRetainTaskState - 我真的不希望它起作用,因为这只会真正影响大约 30 分钟的等待时间。

我觉得是怎么回事

activity 管理器/意图系统中没有机制可以在当前状态下打开 运行 应用程序。相反,我认为启动应用程序的 UID 被考虑在内。如果不同,则强制使用 Intent.FLAG_ACTIVITY_NEW_TASK 标志,因此创建了一个新任务并删除了我所有用户的可爱状态。

正在检查 Google 地图

Google 地图与我们的应用程序有一个非常相似的交互模型:一个设置 UI,然后是一个持续的过程,用户正在经历很长一段时间(导航)配对的前台服务(您可以在通知栏中看到的导航服务)。但是 GMaps 不会遇到这个问题。我认为这是因为它只使用一个 activity 用于它的所有接口 使用 singleTask。所以现在,当您最初从 Play 商店启动后点击启动器时,可以重复使用该任务。

在我看来,这暴露了 android intent/activity 管理系统中的漏洞。 savedInstanceState/activity 生命周期的重点是防止丢弃状态,但这里我们有一种方法可以丢弃所有内容。我目前最好的解决方案是根据服务 运行 的事实来检测应用程序重启,并尝试让用户回到原来的位置,这有点棘手。

如果有人知道我可以防止在从商店打开后从应用程序启动器重新打开时状态掉落在地板上,我将不胜感激。

这更像是您问题的解决方法,但似乎没有真正的解决方案。

我的第一个想法是 - 因为整个设置无论如何都需要一段时间 - 为什么不将某种书签 ('firstLaunch') 保存到首选项,post a(延迟? ) 通知并完成应用程序,以便用户必须通过点击启动器图标再次打开它。只有这样你才开始真正的安装,所以你不会因为安装程序与启动程序的问题而丢失信息。

但问题似乎已经存在一段时间了,以下 SO-post 可能会有所帮助:

Re-launch of Activity on Home button, but…only the first time

After tap on app icon,launcher create a new instance of root activity again & again

希望对您有所帮助!