2

根据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实例与第一次启动的不同。

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

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

我们期待onCreate-> onResume->onActivityResult

4

2 回答 2

3

一个明显的观察结果是,为了从长期按下的主页恢复活动,它也会破坏并重新创建应用程序。

不,它不会。

如果您的进程已终止,那么当为您创建一个新进程时(无论您如何启动应用程序),Application都会创建一个新进程作为该新进程的一部分。这与“从长期按下的主页恢复活动”没有直接关系。

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

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

我之前的断言是savedInstanceStatenull正确的,对此我深表歉意。的主要场景savedInstanceState是配置更改。但是,我忘记了从最近的任务列表启动(“从长按主页恢复活动”)也将传递最后保存的实例状态。通过其他方式启动,例如从主屏幕启动器,将传递nullsavedInstanceState.

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

于 2013-07-18T18:21:47.003 回答
0

看一下这个 -https://developer.android.com/reference/android/app/Activity#isChangingConfigurations()

您可以简单地保存由isChangingConfigurations()捆绑返回的值,然后将其签入onCreate

于 2019-08-30T11:52:41.523 回答