[android] 如何防止应用程序重新启动后使用启动器后?


Answers

Question

当我使用应用程序商店启动应用程序时,我的Android应用程序正在重新启动使用启动程序(反之亦然)。 有什么办法可以防止这个?

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

随着我们开始一个前台服务和设置活动,问题进一步复杂化。 点击服务通知应该让用户回到设置活动,但是和启动器一样,如果用户最初从Play商店打开了应用程序,他们又会失去所有的状态!

重现问题

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

https://github.com/samskiter/LaunchTest

注意:它使用BBC天气应用软件包ID,以便您从应用程序商店快速打开(如果安装了此应用程序,则会在BBC天气应用程序中显示“打开”按钮)。

步骤如下:

  1. 卸载BBC天气应用程序,如果你有它
  2. 安装LaunchTest应用程序
  3. 关闭从最近的LaunchTest应用程序
  4. 从Play商店的BBC天气应用页面打开LaunchTest应用程序
  5. 点击按钮导航到第二个活动
  6. 背景应用程序(按首页)
  7. 从应用启动器打开LaunchTest应用程序
  8. 国家迷路了! 你回到了第一个 (根)活动

我试过了

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

我已经尝试过alwaysRetainTaskState - 我并不真正期待这个工作,因为这只会影响30多分钟的等待。

我认为正在发生

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

检查Google地图

谷歌地图有一个非常相似的交互模型,我们的应用程序:一个设置用户界面,其次是一个正在进行的过程,用户正在经历很长一段时间(导航)与配对,前景服务(您可以看到您的导航服务通知栏)。 但GMaps不会遭受这个问题。 我认为这是因为它只为它的所有接口使用单个活动, 使用singleTask 。 所以现在,当你从游戏商店最初启动后点击启动器,任务就可以重新使用。

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

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




Related