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

3
onCreate(Bundle bdl){}中,我们必须通过super.onCreate(bdl)调用其父构造函数。
对于新创建的活动,在onCreate(Bundle bdl){}中我们获得了一个空的Bundle。因此,当我们调用super.onCreate(bdl)时,它与调用super.onCreate(null)是一样的。
对于重建的活动(例如旋转后),我们获得了一个非空的Bundle。但我注意到即使我们调用super.onCreate(null),而不是super.onCreate(bdl),似乎也是相同的。布局恢复工作在super.onRestoreInstanceState(bdl)中完成。
那么,在所有情况下,调用super.onCreate(null)真的与调用super.onCreate(bdl)相同吗?
谢谢。

我认为这是不同的...当你的应用程序暂停一段时间后,你如何恢复它呢?如果你传递null。 - Pragnani
2个回答

10
根据Android源代码,Activity.onCreate()方法将saveInstanceState捆绑包转发给活动的片段。更具体地说,它获取一个带有“android:fragments”键的可包裹对象,并使用FragmentManager.restoreAllStates()方法将此可包裹对象转发到片段,该方法本身在所有片段上恢复状态。 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文档中讲解这个的位置吗?这样我可以更深入地阅读。 - midnite
1
简单来说,如果我们使用 super.onCreate(null);,我们将无法恢复我们的 Fragment。我已经在我的代码中进行了测试。我还有一个关于 Fragmentsaved state 的问题。你能帮忙吗?http://stackoverflow.com/questions/15858854/where-fragment-save-its-state-when-fragmenttransaction-replace 非常感谢! - midnite
@XGouchet 你好,我遇到了一个严重的问题。请想象一种情况,我已经隐藏并添加了2或3个片段,并将它们添加到后退堆栈中。现在,如果我在第3个片段,所有先前的片段都被隐藏并在后退堆栈中。我按下Home键,从ddmms中杀死进程。当我回到应用程序时,前面隐藏的2个片段显示在第3个片段的背景上。此外,按下返回键不会记住过渡动画。你能帮忙吗? - Muhammad Babar
我知道这是正常的行为。所有东西都被重新创建,但是我该如何处理片段,使它们不会变得可见。 - Muhammad Babar
@XGouchet 你认为这个问题怎么样: http://stackoverflow.com/questions/26142255/retrieve-an-activity-after-time-out-warning-notification - Hamid
显示剩余3条评论

0

你找到这个的最简单方法是使用Log()实用程序。

但请注意,您可以使用bundle将内容放入其中。

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

使用getArguments()进行检索。

简而言之,这取决于您是否在应用中使用包参数。如果没有,则可能是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接