用null参数调用super.onCreate()?

mid*_*ite 3 android android-layout android-view android-activity

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

对于新创建的活动,我们得到了一个null Bundle onCreate(Bundle bdl){}.因此,当我们打电话时super.onCreate(bdl),它与呼叫相同super.onCreate(null).

对于重建的活动(如旋转后),我们得到了一个非null的Bundle.但我注意到即使我们打电话super.onCreate(null),而不是super.onCreate(bdl),它似乎是相同的.布局恢复工作完成super.onRestoreInstanceState(bdl).

那么,呼叫super.onCreate(null)是否真的与呼叫super.onCreate(bdl)所有情况一样?

谢谢.

XGo*_*het 9

根据Android源代码,该Activity.onCreate()方法将saveInstanceState包转发给活动的片段.更具体地说,它使用"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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)