Android中用onSaveInstanceState儲存Fragment狀態的方法_Android

來源:互聯網
上載者:User

在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()這些方法.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.