Android 当从另一个应用程序启动时,应用程序将失去记忆堆栈的能力

Android 当从另一个应用程序启动时,应用程序将失去记忆堆栈的能力,android,android-activity,stack,task,Android,Android Activity,Stack,Task,现在,我已经对这个问题进行了更多的研究,我正在重写它,以使它更清晰。如果您正在查找更多信息,则在较旧的编辑中有一些可用信息 正在发生的事情: (这是指尚未设置任何启动模式的应用程序 设置,以及使用默认设置) 您可以从市场或安装程序启动应用程序。这 使用启动应用程序的根/主活动 标记\活动\新建\任务标记,无类别。现在 应用程序堆栈为[A] 然后继续应用程序中的下一个活动。现在 此任务中的堆栈为[A>B] 然后按home键,然后重新启动相同的应用程序 从主屏幕或应用程序托盘中按其图标 此时的预期是

现在,我已经对这个问题进行了更多的研究,我正在重写它,以使它更清晰。如果您正在查找更多信息,则在较旧的编辑中有一些可用信息

正在发生的事情:

(这是指尚未设置任何启动模式的应用程序 设置,以及使用默认设置)

  • 您可以从市场或安装程序启动应用程序。这 使用启动应用程序的根/主活动 标记\活动\新建\任务标记,无类别。现在 应用程序堆栈为[A]

  • 然后继续应用程序中的下一个活动。现在 此任务中的堆栈为[A>B]

  • 然后按home键,然后重新启动相同的应用程序 从主屏幕或应用程序托盘中按其图标

  • 此时的预期是活动B将显示,因为 这就是你结束的地方。但是,将显示一个,并且任务堆栈为 [A>B>A]A的第二个实例是使用 以下标志:标志活动新任务, 如果需要,标记活动重置,并将活动带到前面。信息技术 还有android.intent.category.LAUNCHER类别

  • 此时,如果您按back键,它将返回到B,因为 是你离开的时候

    看看文档,似乎 仅应为以下活动设置标志\u活动\u带到\u前面 使用singleTask或singleTop启动模式。但是, 应用程序尚未设置任何启动模式,因此正在使用 默认标准启动模式

    我想这种情况不应该发生

    我还应该注意,一旦它进入这种奇怪的状态,那么每次从主屏幕或应用程序托盘启动应用程序时都会发生这种情况。如果任务已完成(重新启动 打电话,强制停止应用程序,或通过 堆栈)将修复此问题,并且不再错误地启动它。 只有从安装程序或市场启动应用程序并 然后试着从发射器发射它


    总之,为什么会发生这种情况?有什么方法可以阻止它吗?

    覆盖OnConfiguration Changed()应该可以帮助您保留该状态

    配置更改

    如果设备的配置(由Resources.configuration类定义)发生更改,则显示用户界面的任何内容都需要更新以匹配该配置。因为活动是与用户交互的主要机制,所以它包括处理配置更改的特殊支持

    除非您另有指定,否则配置更改(如屏幕方向、语言、输入设备等的更改)将导致当前活动被销毁,并根据需要执行onPause()、onStop()和onDestroy()的正常活动生命周期过程。如果活动位于前台或对用户可见,则在该实例中调用onDestroy()后,将创建该活动的新实例,并使用先前实例从onSaveInstanceState(Bundle)生成的任何savedInstanceState

    这是因为任何应用程序资源(包括布局文件)都可以根据任何配置值进行更改。因此,处理配置更改的唯一安全方法是重新检索所有资源,包括布局、可绘制内容和字符串。因为活动必须已经知道如何保存它们的状态并从该状态重新创建它们自己,所以这是一种方便的方法,可以使用新配置重新启动活动本身

    在某些特殊情况下,您可能希望基于一种或多种类型的配置更改绕过活动的重新启动。这是通过清单中的android:configChanges属性完成的。对于您所说要在此处处理的任何类型的配置更改,您将收到对当前活动的onConfigurationChanged(配置)方法的调用,而不是重新启动。但是,如果配置更改涉及任何您不处理的内容,活动仍将重新启动,并且不会调用OnConfiguration Changed(配置)。”


    到目前为止,我已经提出了一个解决方案。我看到的一些其他解决方案涉及查看当前正在运行的任务。但是,我真的不想仅仅为了解决问题而向用户请求另一个权限(GET_tasks)

    如果你看到这上面有洞,请告诉我

    在main/root活动的onCreate方法中,检查意图是否正确 标志_ACTIVITY_将_带到_前端集,如果是,则调用finish() 然后从堆栈中弹出A的额外实例[A>B>A]成为 [A>B]从用户的角度来看,它启动到 他们期待的活动

    到目前为止,它似乎在我所有的测试中都有效。我唯一担心的是如果 有一种奇怪的情况,有些人的启动器总是标记一个 使用FLAG_活动启动\u将\u带到\u前端,即使应用程序未启动 已经在执行任务,因此会将其完全锁定 因为它将调用finish(),而堆栈中没有任何要调用的内容 返回

    --

    根据此处评论中的要求,您可以检查意图是否具有特定标志:

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


    另外,我应该注意到,我仍然看到这个问题有时会出现。这似乎不是一个完美的解决方案。

    感谢您的回复。我实际上已经覆盖了我所有活动的配置更改,但我认为这并不适用于此问题。以前的活动甚至从未调用过再次,调用直接转到根活动A。@littleFluffyKitty我有一个类似的问题,我使用了一个单例类对象来存储对象的最后一个活动,但是你不会丢失活动的状态,因为它们的onSavedInstanceState值会被删除吗?@littleFluffyKitty嗯……对我来说