android - 当从另一个应用程序启动时,应用程序失去了记住其堆栈的能力

标签 android android-activity stack task

既然我已经对此进行了更多研究,我正在重写它以使其更清楚。如果您正在寻找更多信息,可以在较旧的编辑中找到一些信息。

发生了什么:

(这里指的是没有设置任何launchMode的应用 设置等使用默认值)

  1. 您从市场或安装程序启动应用程序。这个 使用以下命令启动应用程序的根/主要 Activity FLAG_ACTIVITY_NEW_TASK 标志,没有类别。现在的 应用程序堆栈是 [ A ]

  2. 然后您继续应用程序中的下一个 Activity 。现在 此任务中的堆栈是 [ A > B ]

  3. 然后您按下主页键,然后重新启动同一个应用程序 在主屏幕或应用程序托盘中按它的图标。

  4. 此时预期 Activity B 将显示,因为 那就是你离开的地方。但是显示 A 并且任务堆栈是 [ A > B > A ] A 的第二个实例是用 以下标志:FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_RESET_IF_NEEDED 和 FLAG_ACTIVITY_BROUGHT_TO_FRONT。它 还有 android.intent.category.LAUNCHER 类别。

此时,如果你按下返回键,它会返回到 B,因为它 是你离开它的时候。

看文档好像 FLAG_ACTIVITY_BROUGHT_TO_FRONT 应该只为 Activity 设置 使用 singleTask 或 singleTop launchModes。然而,这 应用程序尚未设置任何启动模式,因此正在使用 默认标准启动模式。

我假设在这种情况下不会发生这种情况?

我还应该注意,一旦它进入这种奇怪的状态,每次从主屏幕或应用程序托盘启动应用程序时都会发生这种情况。如果任务完成(重新启动 电话,强行停止应用程序,或一路回击 stack) 将解决这个问题,并且不会再错误地启动它。 仅当您从安装程序或市场启动应用程序并且 然后尝试从启动器启动它。

所以总而言之,为什么会这样?有什么办法可以预防吗?

最佳答案

这是我到目前为止想出的解决方法。我看到的其他一些解决方法涉及查看当前正在运行的任务。但是,我真的不想为了解决问题而向用户请求另一个许可 (GET_TASKS)。

如果您发现其中有任何漏洞,请告诉我。

在主/根 Activity 的 onCreate 方法中,检查 Intent 是否有 FLAG_ACTIVITY_BROUGHT_TO_FRONT 设置,如果是,调用 finish()。这个 然后从堆栈中弹出 A 的额外实例 [ A > B > A ] 变为 [ A > B ] 从用户的角度来看,它进入 他们期待的 Activity 。

到目前为止,它似乎在我的所有测试中都有效。我唯一担心的是,如果 有一些奇怪的情况,某人的发射器总是标记 使用 FLAG_ACTIVITY_BROUGHT_TO_FRONT 启动,即使应用程序不是 已经在一个任务中,因此会完全锁定他们 因为它会调用 finish() 而堆栈中没有任何东西可以 返回。

--

按照此处评论中的要求,您可以如何检查 Intent 是否为特定标志:

int flags = intent.getFlags();
boolean hasFlag = flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT == Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT;

--

另外我应该注意到,我仍然看到这个问题有时会在这个修复到位的情况下发生。这似乎不是一个完美的解决方案。

关于android - 当从另一个应用程序启动时,应用程序失去了记住其堆栈的能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5318885/

相关文章:

java - SQLite 单例方法的内存问题

android - 删除 fragment 问题

android - 如何在 Android 微调器中设置数据?

java - 为什么在 Java 中使用 Stack 时会出现 java.util.ConcurrentModificationException?

windows - 如何在 Windows 上获取线程堆栈信息?

java - 将Android手机转换为FM发射器

Android Activity 生命周期和 OpenGL ES 2.0(VBO、着色器等)

android - 在没有 .class 的情况下开始 Activity

android - 调用 LoaderCallbacks.onLoadFinished() 的规则是什么?

c++ - 如果有人能向我解释这里发生了什么