2013-02-27 20 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); 

並與檢索。

簡而言之 - 這取決於您是否在應用程序中使用包參數。如果不是,那麼它可能是相同的。