【轉】android筆記--保存和恢復activity的狀態數據


一般來說, 調用onPause()和onStop()方法后的activity實例仍然存在於內存中, activity的所有信息和狀態數據不會消失, 當activity重新回到前台之后, 所有的改變都會得到保留. 

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

Java代碼   收藏代碼
  1. <span style="font-size: small;">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.     @Override  
  28.     protected void onSaveInstanceState(Bundle outState) {  
  29.         super.onSaveInstanceState(outState);  
  30.         outState.putString("temp", temp);  
  31.     }  
  32. }</span>  

需要注意的是, 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM