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

cot*_*aws 9 stack android task android-activity

现在我已经研究了这个,我正在改写它以使它更清楚.如果您正在寻找更多信息,可以使用旧编辑中的一些信息.

怎么了:

(这是指未设置任何launchMode设置的应用程序,因此使用默认设置)

  1. 您从市场或安装程序启动应用程序.这将使用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类别.

此时,如果您按下后退键,它将返回B,就像您离开时一样.

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

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

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

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

GSr*_*ree -1

重写 onConfigurationChanged() 应该可以帮助您保留状态。

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

配置变更

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

除非您另外指定,否则配置更改(例如屏幕方向、语言、输入设备等的更改)将导致您当前的 Activity 被销毁,从而经历 onPause()、onStop() 和 onPause() 的正常 Activity 生命周期过程onDestroy() 视情况而定。如果该 Activity 位于前台或对用户可见,则一旦在该实例中调用 onDestroy(),就会创建该 Activity 的一个新实例,并使用前一个实例从 onSaveInstanceState(Bundle) 生成的 SaveInstanceState。

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

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