2013-02-27 63 views
1

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

对于新创建的活动,我们在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)一样真的是真的吗?

谢谢。

+0

我认为这是不同的......当你的应用程序暂停了一段时间,如何你能恢复它..?如果你通过null – Pragnani 2013-02-27 15:39:39

回答

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); 
     } 
    } 
} 
+0

好!谢谢回答!我将很快尝试关于碎片,你能在Android文档中引用关于这个的位置吗?所以我可以更深入地阅读。 – midnite 2013-02-27 16:00:13

+0

这不是在文档中,而是在源代码中。我会相应地编辑我的答案。 – XGouchet 2013-02-27 16:05:21

+0

再次感谢!如果你能给我们一个简单的例子,说明片段中的差异将会非常非常赞赏! – midnite 2013-02-27 16:09:47

0

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

虽然,考虑到裸露,你可以把东西成束与

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

并与检索。

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