在Fragment裡面,利用onSaveInstanceState儲存資料,並可在onActivityCreated裡面恢複資料。
public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... if (savedInstanceState != null) { // Restore the fragment's state here }}public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Save the fragment's state here}
在Activity裡面,利用onSaveInstanceState儲存Fragment執行個體的資料,並可在onCreate裡面恢複資料:
private Fragment myFragment;public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState == null) { // Instantiate fragment } else { // Restore the fragment's instance myFragment = getSupportFragmentManager().getFragment( savedInstanceState, "fragment"); } ...}@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Save the fragment's instance // fragment instance may be null if (myFragment != null) { getSupportFragmentManager().putFragment(outState, "fragment", myFragment); }}
執行個體
首先看一個步驟,如果是人為關閉Activity或者Fragment, 比如點擊了後退鍵,主動關閉當前頁面,就會走 onPause() --> onStop() --> onDestroy() 而onSaveInstanceState() 並不會被調用. onSaveInstanceState() 只有在系統即將要自動清理銷毀Activity或Fragment前才會調用, 比如
1, 由於重力感應 手機從豎屏變為橫屏,
2, 手機點擊Home鍵和長按Home鍵
3, 點擊電源鍵鎖屏時
4, 從當前Activity跳到另一個Activity
5, 應用記憶體不足即將自動銷毀時等情況
綜合上面的情況,可以看出, onSaveInstanceState() 這個方法適合臨時儲存一些非永久性的資料.如果要持久化儲存資料,就要將操作放在onStop(), onDestroy()這些方法中去.onSaveInstanceState() 適合的是當前Activity或者Fragment一旦被系統自己銷毀,應用還能在這之前儲存一些必要的資料, 並且使用者的操作很快又回到當前這個頁面,這個時候資料並沒有丟失,還能最大程度的恢複之前狀態.這就是這個方法最大的意義.下面上例子做個簡單樣本:
在Fragment中:
//系統自動銷毀Fragment前儲存必要的資料@Overridepublic void onSaveInstanceState(Bundle outState){<span style="white-space:pre"> </span>super.onSaveInstanceState(outState);<span style="white-space:pre"> </span>String content = etCon.getText().toString();<span style="white-space:pre"> </span>outState.putString("inputCon", content);} //恢複資料@Overridepublic void onViewStateRestored(Bundle savedInstanceState){<span style="white-space:pre"> </span>super.onViewStateRestored(savedInstanceState);<span style="white-space:pre"> </span>//恢複之前輸入框的內容<span style="white-space:pre"> </span>if(savedInstanceState != null){<span style="white-space:pre"> </span>etCon.setText(savedInstanceState.getString("inputCon", "")); }}
在Activity中
//系統自動銷毀Activity前儲存必要的資料@Overridepublic void onSaveInstanceState(Bundle outState){<span style="white-space:pre"> </span>super.onSaveInstanceState(outState); String content = etCon.getText().toString(); outState.putString("inputCon", content);} //Activity中可在onRestoreInstanceState()方法恢複資料,也可以在onCreate()中恢複,因為Activity一旦被銷毀就會重走一次onCreate()開始的正常生命週期@Overridepublic void onRestoreInstanceState(Bundle savedInstanceState){ super.onRestoreInstanceState(savedInstanceState); //恢複之前輸入框的內容 if(savedInstanceState != null){ etCon.setText(savedInstanceState.getString("inputCon", "")); }} @Overridepublic void onDestroy(){ super.onDestroy(); //Activity被銷毀前可進行最後一次資料的儲存,過了這村就沒這店了.}
這裡有個重要的點,上面的上面所提及的onSaveInstanceState()方法只有在Activity或Fragment確定要被系統自動清除時,才會被調用,如果不是長期後台應用,頁面沒有被系統kill掉,對應的Activity或Fragment也就不會調用onSaveInstanceState()這些方法.