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

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

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

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

再现问题

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

https://github.com/samskiter/LaunchTest

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

步骤如下:

>如果你有它,请卸载BBC天气应用程序
>安装LaunchTest应用程序
>从最近关闭LaunchTest应用程序
>从Play商店的BBC天气应用程序页面打开LaunchTest应用程序
>单击按钮以导航到第二个活动
>背景应用(按回家)
>从应用启动器打开LaunchTest应用程序
>国家失败了!你回到了First(root)活动

我试过的

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

我已经尝试过alwaysRetainTaskState – 我真的不希望这个工作,因为这只会影响大约30分钟的等待.

我的想法是怎么回事

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

检查谷歌地图

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

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

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

最佳答案 这更像是解决问题的方法,但似乎没有真正的解决方案.

我的第一个想法是 – 因为整个设置还需要一段时间 – 你为什么不把某种书签(‘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

希望这可以帮助!

点赞