从其他应用程序启动时,应用程序失去了记住其堆栈的能力

时间:2011-03-15 22:33:04

标签: android android-activity stack task

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

发生了什么:

(这是指未设置任何launchMode的应用程序 设置等使用默认值

  1. 您从市场或安装程序启动应用程序。这个 用。启动应用程序的root / main活动 FLAG_ACTIVITY_NEW_TASK标志,没有类别。现在 应用程序堆栈是[A]

  2. 然后继续执行应用程序中的下一个活动。现在 这个任务中的堆栈是[A> B]

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

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

  5. 此时,如果你点击后退键,它将返回B,就像它一样 是你离开的时候。

    看一下文档似乎就好了 只应为活动设置FLAG_ACTIVITY_BROUGHT_TO_FRONT 使用singleTask或singleTop launchModes。但是,这个 应用程序尚未设置任何launchModes,因此使用 默认标准launchMode。

    我认为在这种情况下不会发生这种情况?

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

    总而言之,为什么会发生这种情况?有没有办法阻止它?

2 个答案:

答案 0 :(得分:3)

这是我迄今为止提出的解决方法。我看到的其他一些解决方法涉及查看当前正在运行的任务。但是,我真的不想再向用户请求另一个权限(GET_TASKS)来解决问题。

如果你发现任何漏洞,请告诉我。

在main / root活动的onCreate方法中,检查intent是否有 设置FLAG_ACTIVITY_BROUGHT_TO_FRONT,如果是,则调用finish()。这个 然后从堆栈中弹出A的额外实例[A> B> A]变成了 [A> B]并从用户的角度来看,它推出了 他们期待的活动。

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

-

根据评论中的要求,您可以检查特定标志的意图:

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

-

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

答案 1 :(得分:-1)

覆盖onConfigurationChanged()应该可以帮助您保留状态。

http://developer.android.com/reference/android/app/Activity.html

  

配置更改

     

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

     

除非您另行指定,否则配置更改(例如屏幕方向,语言,输入设备等的更改)将导致您的当前活动被破坏,通过onPause(),onStop的正常活动生命周期过程( )和onDestroy()视情况而定。如果活动位于前台或对用户可见,则在该实例中调用onDestroy()后,将创建活动的新实例,以及上一个实例从onSaveInstanceState(Bundle)生成的任何savedInstanceState。

     

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

     

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