Android 如何区分活动娱乐是由屏幕旋转或记忆不足引起的

Android 如何区分活动娱乐是由屏幕旋转或记忆不足引起的,android,Android,据 有各种各样的方式可以触发娱乐活动 屏幕旋转 低记忆条件 我意识到屏幕旋转和低记忆条件会产生完全不同的行为 其中一个明显的观察结果是,对于从长期受压的主目录中恢复活动,它也将破坏并重新创建应用程序 对于屏幕旋转,它不会产生这种行为 我可以知道,Activity或Fragment如何区分这两种情况吗? @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS

有各种各样的方式可以触发娱乐活动

  • 屏幕旋转
  • 低记忆条件
我意识到屏幕旋转低记忆条件会产生完全不同的行为

其中一个明显的观察结果是,对于从长期受压的主目录中恢复活动,它也将破坏并重新创建
应用程序

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

我可以知道,
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 {
    }
    ...
}
要产生低内存条件,请执行以下步骤

  • 按home键将应用程序放入后堆栈
  • 启动内存密集型应用程序
  • 按回家
  • 对其他应用程序重复步骤2-3 5次
  • 再次启动第一个应用程序
  • 您将意识到
    savedInstanceState
    不为空。但是,同时,您会发现当前运行的
    应用程序
    实例与第一次启动的实例不同

  • 除了静态成员在从低内存状态恢复时会变得未初始化之外,我还遇到了一些奇怪的事情

  • 通过
    startActivityForResult
    从父活动启动子活动
  • 执行上述6个步骤
  • 关闭子活动
  • 我们可以观察到父活动的片段具有以下生命周期
    onCreate
    ->
    onActivityResult
    ->
    onResume
  • 我们期待在恢复时创建
    onCreate
    ->
    onResume
    ->
    onActivityResult

    一个明显的观察结果是,对于从长期受压的主应用程序恢复活动,它也会破坏并重新创建应用程序

    不,不会的

    如果您的流程已终止,则当为您创建新流程时(无论您如何启动应用程序),新的
    应用程序将作为新流程的一部分创建。这与“从长时间按下的主页恢复活动”没有直接关系

    请问,活动或片段如何区分这两种情况

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

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


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

    检查此项-
    https://developer.android.com/reference/android/app/Activity#isChangingConfigurations()


    您只需将
    isChangingConfigurations()
    返回的值保存在bundle中,然后在
    onCreate中签入它即可。确实如此,我已经测试过很多次了。重现这种情况的一个关键步骤是,在从长期受压的家中恢复应用程序之前,您需要启动其他几个应用程序(以鼓励操作系统“杀死”当前处于后台的应用程序)。@CheokYanCheng:您自己承认,您的测试证明了我的观点。如果“从长时间被压在家中恢复活动,它也会破坏并重新创建应用程序”,那么它会一直这样做。正如您所记录的,它不是。“启动几个应用程序(最好是内存密集型应用程序,比方说5个)”可能会导致Android由于内存不足而终止您的进程,而终止您的进程会导致新的
    应用程序
    。这与“从长时间按下的主页恢复活动”没有直接关系。确定。我认为我应该改进标题“如何区分活动娱乐是由屏幕旋转或低记忆条件引起的”?这能让事情更清楚吗?@CheokYanCheng:这当然能让事情更准确。而且,正如我的回答所指出的,如果
    savedInstanceState
    不是
    null
    ,则是由于配置更改而重新创建的,否则是由于其他原因重新创建的。您的“配置更改”是否也包括内存不足的情况?您的意思是“它可以销毁并重新创建”,而不是“它将销毁并重新创建”?