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

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

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

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

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

重现问题

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

https://github.com/samskiter/LaunchTest

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

步骤如下:

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

我尝试过的

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

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

我认为是怎么回事

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

检查 Google map

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

在我看来,这暴露了 Android Intent/Activity 管理系统中的一个漏洞。 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

希望这对您有所帮助!

关于android - 商店后使用启动器时如何防止应用重启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31458254/

相关文章:

android - 将值(value)从一项 Activity 传递到另一项 Activity

android - Java Android 传递数据 Array double

android - 如何使 Activity 窗口始终保持在顶部

android - 将 ActionBar 标题对齐 Xamarin

android - 从通知栏打开时的两个 Activity 实例

javascript - 抽屉菜单在 react native 中不起作用

android - 扩展 MapFragment Android

android - 最佳实践 - 将您的应用添加到 Android 共享菜单

java - 将监听器传递给 Android 中的自定义 fragment

android - TakePhotoAsync 相机未打开