【轉】android筆記--儲存和恢複activity的狀態資料

來源:互聯網
上載者:User

標籤:static   http   ecif   save   一般來說   nbsp   記錄   highlight   style   

一般來說, 調用onPause()和onStop()方法後的activity執行個體仍然存在於記憶體中, activity的所有資訊和狀態資料不會消失, 當activity重新回到前台之後, 所有的改變都會得到保留. 

但是當系統記憶體不足時, 調用onPause()和onStop()方法後的activity可能會被系統摧毀, 此時記憶體中就不會存有該activity的執行個體對象了. 如果之後這個activity重新回到前台, 之前所作的改變就會消失. 為了避免此種情況的發生, 開發人員可以覆寫onSaveInstanceState()方法. onSaveInstanceState()方法接受一個Bundle類型的參數, 開發人員可以將狀態資料存放區到這個Bundle對象中, 這樣即使activity被系統摧毀, 當使用者重新啟動這個activity而調用它的onCreate()方法時, 上述的Bundle對象會作為實參傳遞給onCreate()方法, 開發人員可以從Bundle對象中取出儲存的資料, 然後利用這些資料將activity恢複到被摧毀之前的狀態.

Java代碼  
public class MainActivity extends Activity {      public static final int SECOND_ACTIVITY = 0;      private String temp;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          // 從savedInstanceState中恢複資料, 如果沒有資料需要恢複savedInstanceState為null          if (savedInstanceState != null) {              temp = savedInstanceState.getString("temp");              System.out.println("onCreate: temp = " + temp);          }      }        public void onResume() {          super.onResume();          temp = "xing";          System.out.println("onResume: temp = " + temp);          // 切換畫面方向會導致activity的摧毀和重建          if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);              System.out.println("螢幕切換");          }      }            // 將資料儲存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法      @Override      protected void onSaveInstanceState(Bundle outState) {          super.onSaveInstanceState(outState);          outState.putString("temp", temp);      }  }

 

需要注意的是, onSaveInstanceState()方法並不是一定會被調用的, 因為有些情境是不需要儲存狀態資料的. 比如使用者按下BACK鍵退出activity時, 使用者顯然想要關閉這個activity, 此時是沒有必要儲存資料以供下次恢複的, 也就是onSaveInstanceState()方法不會被調用. 如果調用onSaveInstanceState()方法, 調用將發生在onPause()或onStop()方法之前. 

 

onSaveInstanceState()方法的預設實現

如果開發人員沒有覆寫onSaveInstanceState()方法, 此方法的預設實現會自動儲存activity中的某些狀態資料, 比如activity中各種UI控制項的狀態. android應用程式框架中定義的幾乎所有UI控制項都恰當的實現了onSaveInstanceState()方法, 因此當activity被摧毀和重建時, 這些UI控制項會自動儲存和恢複狀態資料. 比如EditText控制項會自動儲存和恢複輸入的資料, 而CheckBox控制項會自動儲存和恢複選中狀態. 開發人員只需要為這些控制項指定一個唯一的ID(通過設定android:id屬性即可), 剩餘的事情就可以自動完成了. 如果沒有為控制項指定ID, 則這個控制項就不會進行自動的資料儲存和恢複操作.

由上所述, 如果開發人員需要覆寫onSaveInstanceState()方法, 一般會在第一行代碼中調用該方法的預設實現: super.onSaveInstanceState(outState).

 

是否需要覆寫onSaveInstanceState()方法

既然該方法的預設實現可以自動的儲存UI控制項的狀態資料, 那什麼時候需要覆寫該方法呢?

如果需要儲存額外的資料時, 就需要覆寫onSaveInstanceState()方法. 如需要儲存類中成員變數的值(見上例).

 

onSaveInstanceState()方法適合儲存什麼資料

由於onSaveInstanceState()方法方法不一定會被調用, 因此不適合在該方法中儲存持久化資料, 例如向資料庫中插入記錄等. 儲存持久化資料的操作應該放在onPause()中. onSaveInstanceState()方法只適合儲存瞬態資料, 比如UI控制項的狀態, 成員變數的值等.

 

引發activity摧毀和重建的其他情形

除了系統處於記憶體不足的原因會摧毀activity之外, 某些系統設定的改變也會導致activity的摧毀和重建. 例如改變螢幕方向(見上例), 改變裝置語言設定, 鍵盤彈出等.

from:http://coolxing.iteye.com/blog/1279447

【轉】android筆記--儲存和恢複activity的狀態資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.