既然我已经对此进行了更多研究,我正在重写它以使其更清楚。如果您正在寻找更多信息,可以在较旧的编辑中找到一些信息。
发生了什么:
(这里指的是没有设置任何launchMode的应用 设置等使用默认值)
您从市场或安装程序启动应用程序。这个 使用以下命令启动应用程序的根/主要 Activity FLAG_ACTIVITY_NEW_TASK 标志,没有类别。现在的 应用程序堆栈是 [ A ]
然后您继续应用程序中的下一个 Activity 。现在 此任务中的堆栈是 [ A > B ]
然后您按下主页键,然后重新启动同一个应用程序 在主屏幕或应用程序托盘中按它的图标。
此时预期 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/