2012-05-30 272 views
96

任何人都可以幫助我瞭解Bundle savedInstanceStateonCreate(Bundle savedInstanceState)我是Android的新手。我試圖從developer.android.com中瞭解它。但我無法理解。任何人都可以簡化它?什麼是onCreate(Bundle savedInstanceState)

+2

這是一個很好的視頻:https://www.youtube.com/watch?v=kkYIMZw9gzQ –

回答

91

如果將應用程序的狀態保存在一個包中(通常爲非持久動態數據,在onSaveInstanceState中),如果需要重新創建活動(例如,方向更改),則可以將其傳回至onCreate,以便您不要失去這個先前的信息。如果沒有提供數據,則savedInstanceState爲空。

...你 應該使用的onPause()方法,以任何持久性數據(如 用戶編輯)寫入存儲。另外,方法 onSaveInstanceState(Bundle)在將活動置於 這樣的背景狀態之前被調用,允許您將活動中的任何動態 實例狀態保存到給定的Bundle中,稍後在onCreate中收到 (Bundle )如果活動需要重新創建。 有關如何將流程的生命週期與其託管的活動綁定的詳細信息,請參閱流程生命週期部分。注意 ,因爲後者不是 生命週期回調的一部分,所以在onPause()而不是 onSaveInstanceState(Bundle)中保存持久數據非常重要,因此在其文檔中描述的 在每種情況下都不會被調用。

source

+1

是否有其他活動共享相同的Bundle?,如果我開始另一個活動,它是否會通過第一個活動的Bundle? –

12

onCreate(Bundle savedInstanceState)你會得到Bundle空當活動開始獲取第一次,它會在使用時得到的活動方向得到改變.......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android提供的另一種優雅的方式實現這一點。爲了達到這個目的,我們必須重寫一個名爲onSaveInstanceState()的方法。 Android平臺允許用戶保存任何實例狀態。實例狀態可以保存在Bundle中。 Bundle作爲參數傳遞給onSaveInstanceState方法。

我們可以從作爲參數傳遞給Bundle的Bundle中加載保存的實例狀態到onCreate方法。我們也可以在onRestoreInstanceState方法中加載保存的實例狀態。但是我會留給讀者去弄清楚。

+8

如果先前調用了onSavedInstanceState(),'savedInstanceState'將是非'null'。方向變化只是這種情況發生的一個例子。 –

+0

@AlexLockwood,我試圖想到可能發生這種情況的所有情況。有沒有文件?我能想到的一個例子是,如果用戶切換應用程序並返回,但該活動已被銷燬以恢復資源。在這種情況下,如果onSaveInsanceState()被覆蓋,android會重新創建一個包的活動,對嗎? – batbrat

+1

@batbrat是的......我所做的評論(幾乎兩年前)並不完全正確。我猜想最好的方法是將'onCreate(Bundle)'的Bundle參數設置爲非'null',當且僅當'Activity'具有之前調用的'onSaveInstanceState'方法。這發生在方向更改過程中......並且在操作系統終止活動並且在設備上觸發其他任何感興趣的配置更改時再次發生。 –

3

onCreate(Bundle)活動時第一次啓動時被調用。您可以使用它來執行一次性初始化,例如創建用戶界面。 onCreate()接受一個參數,該參數爲null或由onSaveInstanceState先前保存的某些狀態信息。

0

onCreate(Bundle savedInstanceState)被調用並且savedInstanceState在您的Activity和它在上述場景(可視視圖)中被終止時將爲非null。然後,您的應用可以抓取 (捕獲)來自savedInstanceState的數據並重新生成活動

7

正如Dhruv Gairola回答的那樣,您可以使用Bundle savedInstanceState保存應用程序的狀態。我想給一個非常簡單的例子,像我這樣的新學員可以輕鬆理解。

假設你有一個帶有TextView和Button的簡單片段。每次點擊按鈕時,文字都會改變。現在,改變你的設備/仿真器的方向,並注意你丟失了數據(意味着你點擊後得到的數據發生變化),並且碎片從第一次開始。通過使用Bundle savedInstanceState,我們可以擺脫這一點。如果你看看片段的生命線。 Fragment Lifecylce你會得到一個方法「onSaveInstanceState」在片段即將銷燬時被調用。

因此,我們可以保存狀態是指變化的文本值成束這樣

int counter = 0; 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("value",counter); 
} 

您做出取向「的onCreate」方法將被稱爲右後?所以我們可以做到這一點

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(savedInstanceState == null){ 
     //it is the first time the fragment is being called 
     counter = 0; 
    }else{ 
     //not the first time so we will check SavedInstanceState bundle 
     counter = savedInstanceState.getInt("value",0); //here zero is the default value 
    } 
} 

現在,你不會失去你的價值取向後。修改後的值將始終顯示。

+0

請注意,這也適用於活動。你能解釋更多關於(活動捆綁)和碎片捆綁的區別嗎? – laalaguer

+0

您可以從活動和片段的生命週期中清楚地瞭解活動可以一次顯示多個片段的情況。因此,基本區別在於您可能希望爲活動的所有片段保存一些值,然後將u將使用活動包,否則你應該使用bundle的片段,如果它是針對特定的片段。 – Asad

1

的onCreate(捆綁savedInstanceState)功能在機器人:

1)當活動第一呼叫或發起然後的onCreate(捆綁savedInstanceState)方法負責創建的活性。 2)當任何操作系統的方向(即從水平到垂直或垂直到水平)被改變時,或者當任何操作系統強制終止活動時,然後savedInstanceState,即Bundle Class的對象將保存活動的狀態。

3)方向改變後,onCreate(Bundle savedInstanceState)將調用並重新創建活動並加載所有來自savedInstanceState的數據。

4)基本上Bundle類是用來存儲活動的數據,每當上述情況發生在應用程序中。

5)應用程序不需要onCreate()。但它在應用程序中使用的原因是因爲該方法是放置初始化代碼的最佳位置。你也可以把你的初始化代碼放在onStart()或onResume()中,當你的應用程序首先加載時,它將和onCreate()一樣工作。

相關問題