在onCreate(Bundle bdl){}
中,我们必须通过super.onCreate(bdl)
调用其超级构造函数。
对于新创建的活动,我们在onCreate(Bundle bdl){}
中获得了一个null Bundle。因此,当我们调用super.onCreate(bdl)
时,它与调用super.onCreate(null)
相同。
对于重建活动(如旋转后),我们得到了一个非null的Bundle。但我注意到即使我们拨打super.onCreate(null)
而不是super.onCreate(bdl)
,它似乎也是一样的。布局恢复工作在super.onRestoreInstanceState(bdl)
完成。
那么,调用super.onCreate(null)
与在所有情况下调用super.onCreate(bdl)
相同是真的吗?
感谢。
答案 0 :(得分:9)
根据Android源代码,Activity.onCreate()
方法将saveInstanceState包转发给活动的片段。更具体地说,它使用“android:fragments”键获取一个parcelable,并使用FragmentManager.restoreAllStates()
方法将此parcelable转发给片段,该方法本身可以恢复所有片段的状态。
Activity.onRestoreInstanceState()
方法将捆绑包转发到活动窗口。它再次从保存的实例中获取“android:viewHierarchyState”包,并使用Window.restoreHierarchyState()
方法将其转发到窗口。
所以要回答你的问题,如果你的活动不使用碎片,那么确实调用super.onCreate(null)
不会改变任何东西。但作为最佳实践,我建议您始终转发确切的savedInstance包(除非您知道自己在做什么)。
编辑:以下是我所谈到的示例源代码,摘自AOSP第17版:
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);
}
}
}
答案 1 :(得分:0)
找到这个的最简单方法是使用Log()实用程序。
虽然,请记住,您可以将内容放入
包中Bundle bdl = new Bundle(1);
bdl.putString("file_absolute_path", f.getAbsolutePath());
cf.setArguments(bdl);
并使用getArguments()
检索它们。
简而言之 - 这取决于您是否在应用中使用了捆绑参数。如果不是,那么它可能是相同的。