安卓開發--臨時儲存狀態

來源:互聯網
上載者:User

標籤:

內容為轉載

轉載自:coolxing大神  http://coolxing.iteye.com/blog/1279447

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

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

 1 public class MainActivity extends Activity { 2     public static final int SECOND_ACTIVITY = 0; 3     private String temp; 4  5     @Override 6     public void onCreate(Bundle savedInstanceState) { 7         super.onCreate(savedInstanceState); 8         // 從savedInstanceState中恢複資料, 如果沒有資料需要恢複savedInstanceState為null 9         if (savedInstanceState != null) {10             temp = savedInstanceState.getString("temp");11             System.out.println("onCreate: temp = " + temp);12         }13     }14 15     public void onResume() {16         super.onResume();17         temp = "xing";18         System.out.println("onResume: temp = " + temp);19         // 切換畫面方向會導致activity的摧毀和重建20         if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {21             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);22             System.out.println("螢幕切換");23         }24     }25     26     // 將資料儲存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法27     @Override28     protected void onSaveInstanceState(Bundle outState) {29         super.onSaveInstanceState(outState);30         outState.putString("temp", temp);31     }32 

 

需要注意的是, 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的摧毀和重建. 例如改變螢幕方向(見上例), 改變裝置語言設定, 鍵盤彈出等.

 

安卓開發--臨時儲存狀態

聯繫我們

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