3

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)

谢谢。

4

2 回答 2

10

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

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

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

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

活动.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);
        }
    }
}
于 2013-02-27T15:54:55.527 回答
0

找出这一点的最简单方法是使用 Log() 实用程序。

虽然,请记住,您可以将东西放入捆绑包中

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

并用getArguments().

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

于 2013-02-27T15:38:30.307 回答