【问题标题】:Calling super.onCreate() with null parameter?使用 null 参数调用 super.onCreate()?
【发布时间】:2013-02-13 11:44:40
【问题描述】:

onCreate(Bundle bdl){}中,我们必须通过super.onCreate(bdl)调用它的超级构造函数。

对于新创建的活动,我们在onCreate(Bundle bdl){} 中获得了一个空包。所以当我们调用super.onCreate(bdl)时,和调用super.onCreate(null)是一样的。

对于重构的活动(如旋转后),我们得到了一个非空的 Bundle。但我注意到,即使我们调用super.onCreate(null),而不是super.onCreate(bdl),它似乎也是一样的。版面修复工作在super.onRestoreInstanceState(bdl)完成。

那么,在所有情况下调用super.onCreate(null) 与调用super.onCreate(bdl) 真的是一样的吗?

谢谢。

【问题讨论】:

  • 我认为它是不同的......当你的应用程序暂停一段时间,你怎么能恢复它..?如果你通过 null

标签: android android-layout android-activity android-view


【解决方案1】:

根据 Android 源代码,Activity.onCreate() 方法将 saveInstanceState 包转发到 Activity 的 Fragment。更具体地说,它使用“android:fragments”键获取一个parcelable,并使用FragmentManager.restoreAllStates() 方法将此parcelable 转发到片段,该方法本身会恢复所有片段的状态。

Activity.onRestoreInstanceState() 方法将包转发到活动的窗口。它再次从保存的实例中获取“android:viewHierarchyState”包并使用Window.restoreHierarchyState() 方法将其转发到窗口。

所以回答你的问题,如果你的活动不使用片段,那么确实调用super.onCreate(null) 不会改变任何事情。但作为最佳实践,我建议您始终转发确切的 savedInstance 包(除非您知道自己在做什么)。

编辑:这里是我谈到的示例源代码,取自 AOSP v17:

Activity.java

protected void onCreate(Bundle savedInstanceState) {

    // [... some content ellipsed for readability purposes]

    if (savedInstanceState != null) {
        Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
        mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
                ? mLastNonConfigurationInstances.fragments : null);
    }
    mFragments.dispatchCreate();
    getApplication().dispatchActivityCreated(this, savedInstanceState);
    mCalled = true;
}


// [...]

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (mWindow != null) {
        Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
        if (windowState != null) {
            mWindow.restoreHierarchyState(windowState);
        }
    }
}

【讨论】:

  • 不错!谢谢回答!我很快就会尝试使用 Fragments,您能否引用 Android 文档中的下落来讨论这个问题?所以我可以更深入地阅读。
  • 嗯,它不在文档中,而是在源代码中。我会相应地编辑我的答案。
  • 再次感谢!如果您能给我们一个简短的例子来说明 Fragments 的不同之处将非常非常非常感激!!!
  • 抱歉,我需要一些时间来消化并尝试一下。在我理解它之后,我一定会回来并勾选您的答案。非常感谢!
  • 简单地说,如果我们使用super.onCreate(null);,我们将无法恢复我们的Fragments。我已经在我的代码中对其进行了测试。我还有一个关于Fragmentsaved state 的问题。能否请你帮忙? stackoverflow.com/questions/15858854/…非常感谢!!
【解决方案2】:

最简单的方法是使用 Log() 实用程序。

不过,请记住,您可以将内容放入捆绑包中

Bundle bdl = new Bundle(1);
bdl.putString("file_absolute_path", f.getAbsolutePath());
cf.setArguments(bdl);

然后使用getArguments() 检索它们。

简而言之 - 这取决于您是否在应用程序中使用捆绑参数。如果不是,那可能是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2017-05-05
    相关资源
    最近更新 更多