android - 使用空参数调用 super.onCreate()?

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

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

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

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

那么,调用 super.onCreate(null) 是否真的在所有情况下都与调用 super.onCreate(bdl) 相同?

谢谢。

最佳答案

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

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

所以回答你的问题,如果你的 Activity 不使用 fragment ,那么确实调用 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);
        }
    }
}

关于android - 使用空参数调用 super.onCreate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115975/

相关文章:

java - 如何在静态方法中检索共享首选项值

java - Android 4.2.2 Wifi-Direct adhoc 网络——访问隐藏的 android 方法来设置 SSID 和密码?

java - Android:编辑xml中定义的textview

Android:如何使 Activity 返回结果给调用它的 Activity ?

android-studio - 从片段更改 Activity 的按钮状态

android - 如何显示来自 Activity 对话框的编辑文本输入

android - IntelliJ IDEA 找不到android sdk

android - 如何在android中的自定义圆角 ImageView 中设置图像

android - GridLayout 膨胀异常

java - 从不同 Activity 的 TextView 获取文本