根据http://developer.android.com/training/basics/activity-lifecycle/recreating.html
有多种方法可以触发活动娱乐。
我意识到屏幕旋转和内存不足情况会产生完全不同的行为。
其中一个明显的观察结果是,对于来自长时间回家的恢复活动,它也会破坏并重新创建Application
。
对于屏幕旋转,它不会产生这种行为。
我可以知道,Activity
或Fragment
如何区分这两种情况?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Is this caused by screen rotation? Or restoration from low memory condition?
// How can we differentiate among "screen rotation", or "restoration from low memory condition"?
} else {
}
...
}
p / s要产生低内存条件,以下是要完成的步骤。
savedInstanceState
不为空。但是,与此同时,您将意识到当前正在运行的Application
实例与第一次启动的实例不同。除了静态成员在从低内存条件恢复时会变得未初始化,我也会遇到一些奇怪的东西
startActivityForResult
onCreate
- > onActivityResult
- > onResume
我们期待onCreate
- > onResume
- > onActivityResult
答案 0 :(得分:3)
其中一个明显的观察结果是,对于来自长期居家的恢复活动,它也会破坏并重新创建应用程序。
不,它不会。
如果您的流程已终止,那么当您为自己创建新流程时(无论您如何启动应用),都会创建一个新的Application
作为该新流程的一部分。这与“长期回家的恢复活动”无直接关系。
我可以知道,活动或片段如何区分这两种情况?
理想情况下,他们并不关心。他们关心的唯一原因是它们是否依赖于静态数据成员,这些成员可能会也可能不会被初始化,在这种情况下,您使用这些静态数据成员的方式是有问题的。
我之前的断言,savedInstanceState
将是非null
,是不正确的,为此我道歉。 savedInstanceState
的主要方案是配置更改。但是,我忘记了从最近任务列表(“从长按家恢复活动”)启动也将传递最后保存的实例状态。通过其他方式启动,例如从主屏幕启动器启动,将null
传递给savedInstanceState
。
如果您必须区分您的进程被终止和其他方案,请检查一些静态数据成员以查看它是否已初始化。
答案 1 :(得分:0)
签出--https://developer.android.com/reference/android/app/Activity#isChangingConfigurations()
您可以简单地将isChangingConfigurations()
返回的值保存在分发包中,然后在onCreate
中对其进行检查