如何区分活动娱乐是由屏幕旋转或低内存条件引起的

时间:2013-07-18 18:18:22

标签: android

根据http://developer.android.com/training/basics/activity-lifecycle/recreating.html

有多种方法可以触发活动娱乐。

  • 屏幕旋转
  • 内存不足

我意识到屏幕旋转内存不足情况会产生完全不同的行为。

其中一个明显的观察结果是,对于来自长时间回家的恢复活动,它也会破坏并重新创建Application

对于屏幕旋转,它不会产生这种行为。

我可以知道,ActivityFragment如何区分这两种情况?

@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要产生低内存条件,以下是要完成的步骤。

  1. 按回家将应用程序放回堆栈。
  2. 启动内存密集型应用。
  3. 按回家。
  4. 对其他应用程序重复步骤2-3,共5次。
  5. 再次启动第一个应用程序。
  6. 您会意识到savedInstanceState不为空。但是,与此同时,您将意识到当前正在运行的Application实例与第一次启动的实例不同。

  7. 除了静态成员在从低内存条件恢复时会变得未初始化,我也会遇到一些奇怪的东西

    1. 通过startActivityForResult
    2. 从父活动启动子活动
    3. 执行以上6个步骤。
    4. 关闭子活动。
    5. 我们可以观察到父活动的片段具有以下生命周期。 onCreate - > onActivityResult - > onResume
    6. 我们期待onCreate - > onResume - > onActivityResult

2 个答案:

答案 0 :(得分:3)

  

其中一个明显的观察结果是,对于来自长期居家的恢复活动,它也会破坏并重新创建应用程序。

不,它不会。

如果您的流程已终止,那么当您为自己创建新流程时(无论您如何启动应用),都会创建一个新的Application作为该新流程的一部分。这与“长期回家的恢复活动”无直接关系。

  

我可以知道,活动或片段如何区分这两种情况?

理想情况下,他们并不关心。他们关心的唯一原因是它们是否依赖于静态数据成员,这些成员可能会也可能不会被初始化,在这种情况下,您使用这些静态数据成员的方式是有问题的。

我之前的断言,savedInstanceState将是非null,是不正确的,为此我道歉。 savedInstanceState的主要方案是配置更改。但是,我忘记了从最近任务列表(“从长按家恢复活动”)启动也将传递最后保存的实例状态。通过其他方式启动,例如从主屏幕启动器启动,将null传递给savedInstanceState

如果您必须区分您的进程被终止和其他方案,请检查一些静态数据成员以查看它是否已初始化。

答案 1 :(得分:0)

签出--https://developer.android.com/reference/android/app/Activity#isChangingConfigurations()

您可以简单地将isChangingConfigurations()返回的值保存在分发包中,然后在onCreate中对其进行检查