Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中用onSaveInstanceState保存Fragment狀態的方法

Android中用onSaveInstanceState保存Fragment狀態的方法

編輯:關於Android編程

在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");
  }
  ...
}

@Override
protected 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前保存必要的數據
@Override
public void onSaveInstanceState(Bundle outState){
<span > </span>super.onSaveInstanceState(outState);
<span > </span>String content = etCon.getText().toString();
<span > </span>outState.putString("inputCon", content);
}
 
//恢復數據
@Override
public void onViewStateRestored(Bundle savedInstanceState){
<span > </span>super.onViewStateRestored(savedInstanceState);
<span > </span>//恢復之前輸入框的內容
<span > </span>if(savedInstanceState != null){
<span > </span>etCon.setText(savedInstanceState.getString("inputCon", ""));
 }
}

在Activity中

//系統自動銷毀Activity前保存必要的數據
@Override
public void onSaveInstanceState(Bundle outState){
<span > </span>super.onSaveInstanceState(outState);
 String content = etCon.getText().toString();
 outState.putString("inputCon", content);
}
 
//Activity中可在onRestoreInstanceState()方法恢復數據,也可以在onCreate()中恢復,因為Activity一旦被銷毀就會重走一次onCreate()開始的正常生命周期
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
 super.onRestoreInstanceState(savedInstanceState);
 //恢復之前輸入框的內容
 if(savedInstanceState != null){
 etCon.setText(savedInstanceState.getString("inputCon", ""));
 }
}
 
@Override
public void onDestroy(){
 super.onDestroy();
 //Activity被銷毀前可進行最後一次數據的保存,過了這村就沒這店了.
}

這裡有個重要的點,上面的上面所提及的onSaveInstanceState()方法只有在Activity或Fragment確定要被系統自動清除時,才會被調用,如果不是長期後台應用,頁面沒有被系統kill掉,對應的Activity或Fragment也就不會調用onSaveInstanceState()這些方法.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved