如何在存储后使用启动器时阻止应用重启?

时间:2015-07-16 15:18:14

标签: android android-intent android-activity google-play

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

通过重新启动,我的意思是活动堆栈丢失了。这很重要,因为我们的用户在一小时左右的时间内间歇性地设置并返回应用程序中的活动。首次安装后,他们可能已经从应用程序商店安装并打开了应用程序,自行设置,然后对应用程序进行后台处理。之后他们可能会从发射器打开应用程序并失去他们所有的状态!

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

重现问题

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

https://github.com/samskiter/LaunchTest

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

步骤如下:

  1. 如果有的话,请卸载BBC天气应用程序
  2. 安装LaunchTest应用
  3. 从最近关闭LaunchTest应用
  4. 从Play商店的BBC天气应用程序页面打开LaunchTest应用程序
  5. 点击按钮导航至第二次活动
  6. 背景应用程序(按回家)
  7. 从应用启动器
  8. 打开LaunchTest应用程序
  9. 状态丢失了!你回到了第一次(根)活动
  10. 我尝试了什么

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

    我已经尝试alwaysRetainTaskState - 我真的不希望这种情况发挥作用,因为这只会影响大约30分钟的等待。

    我的想法

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

    检查Google地图

    Google地图与我们的应用程序具有非常相似的交互模式:设置用户界面,然后是用户长时间(导航)的持续流程,其中包含配对的前台服务(您可以使用导航服务)请参阅通知栏)。但GMaps并没有遇到这个问题。我认为这是因为它只使用一个活动,所有界面使用singleTask。所以现在,当你从游戏商店最初启动后点击启动器时,任务可以重复使用。

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

    如果有人知道某种方法,我可以防止我的状态在从商店打开后从应用启动器重新打开时被丢弃在地板上,我真的很感激。

1 个答案:

答案 0 :(得分:2)

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

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

但问题似乎已存在一段时间,以下SO帖子可能有所帮助:

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

希望这有帮助!