Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android基礎部分再學習---activity的狀態保存

Android基礎部分再學習---activity的狀態保存

編輯:關於android開發

Android基礎部分再學習---activity的狀態保存


學習Activity的生命周期,我們知道,當Activity進入到paused或者stopped狀態後,這個Activity的狀態仍然保存著。因為這個Activity對象仍然保存在內存中,它的所有信息和狀態仍然是存在的,當這個Activity再次返回到前台是,它仍然保持著離開時候的樣子。

然而,如果Activity進入到了後台,系統為了回收內存,有可能會去銷毀該Activity,那麼,當用戶通過導航返回的時候,系統就不能簡單的去恢復這個Activity,而是會重新創建這個Activity對象。但是對於普通用戶來說,他並不知道系統銷毀了Activity並重新創建它,因此,可能希望該Activity保存和他離開時候一樣的狀態。

在這種情況下,您可以通過回調方法onSaveInstanceState()來保存Activity的一些重要信息,並通過onCreate()或者onRestoreInstanceState()回調方法來恢復這些信息。

  1. @Override
  2. protectedvoidonSaveInstanceState(BundleoutState){
  3. super.onSaveInstanceState(outState);
  4. Log.d("roamer","onSaveInstanceState");
  5. }
  6.  
  7. @Override
  8. protectedvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. Log.d("roamer","onCreate");
  12. }
  13.  
  14. @Override
  15. protectedvoidonRestoreInstanceState(BundlesavedInstanceState){
  16. super.onRestoreInstanceState(savedInstanceState);
  17. Log.d("roamer","onRestoreInstanceState");
  18. }
    通過onSaveInstanceState()方法傳遞進來的Bundle對象中,存入我們想要保存的東西。然後,當Activity被重新創建的時候,我們就可以通過onCreate()或者onRestoreInstanceState()方法的Bundle對象,來獲得我們之前存入的數據。至於Bundle的用法,就不多說了。

    過程如下圖:

    \
     

    注意:並不是每一次Activity銷毀,系統都回去回調onSaveInstanceState()方法,我們是我們自己finish掉該Activity,那麼onSaveInstanceState()方法就不會被調用。

    並且系統調用onSaveInstanceState()方法的時機一般是在onStop()之前,但是也有可能是onPause之前。

    並且系統調用onRestoreInstanceState()的時機,是在onStart()之後,onResume之前。

    Activity狀態保存的默認機制

    然而,即使我們不重寫onSaveInstanceState()方法,Activity對於onSaveInstanceState()方法的默認實現,仍然會幫我們恢復某些狀態。具體來說,默認的實現會幫我們調用該Activity布局中每個View的onSaveInstanceState()方法。View中的onSaveInstanceState()方法體如下:  
    1. //View的onRestoreInstanceState()方法
    2. //該方法允許每個View提供自己需要保存的信息
    3. @Override
    4. protectedvoidonRestoreInstanceState(Parcelablestate){
    5. //TODOAuto-generatedmethodstub
    6. super.onRestoreInstanceState(state);
    7. }
      幾乎Android框架中的每一個widget都適當的實現了這個方法,這樣任何可見的UI更改活動在重新創建時自動保存和恢復。例如,EditText部件保存用戶輸入的任何文本,CheckBox部件保存是否被選中。我們唯一要做的工作就是提供一個惟一的ID(android:ID屬性)為每個widget保存其狀態。如果一個部件沒有一個ID,則系統不能保存其狀態。當然,如果在某些特殊的情況下,你不需要某個View自動保存和恢復他的狀態,那麼你可以設置View的屬性android:saveEnabled為false,或者調用setSaveEnabled()方法。

       

      盡管系統幫我們實現了UI組建的自動保存和恢復,但是有時候也需要去保存和恢復一些其他的成員變量。在這種情況下,記得重寫onSaveInstanceState()和onRestoreInstanceState()方法是,記得帶上super方法的實現,因為那裡就是系統UI組件自動保存和恢復的默認實現。

      注意:因為onSaveInstnceState()方法並不是Activity銷毀前一定被執行,所以你最好僅僅保存與Activity狀態相關的信息(UI狀態)。你不應該去保存那些持久化的數據,那些持久化的數據應該放到onPause方法裡面去執行(比如將數據存儲到數據庫中)。

      測試Activity狀態保存的方法

      Activity調用onSaveInstanceState()方法時機還好,但是調用onRestoreInstanceState()就有點不太好控制,因為等到系統內存不夠去銷毀Activity也是比較難以控制的。所以我們可以用下面的辦法,來測試Activity的狀態保存。 就是旋轉設置,讓屏幕方向變化(當然前提是你沒有鎖定設置的旋轉功能,Activity也沒有設置屏幕方向)。當屏幕方向變化時,系統為了新的屏幕配置尋找替代資源,會銷毀和重建Activity。   activity的狀態保存,我們最主要的問題有三點: 1.onSaveInstanceState這個方法什麼時候被執行,因為他不是必須的,不是activity生命周期中必須的流程

      onSaveInstanceState() 只有在系統即將要自動清理銷毀Activity或Fragment前才會調用,

      換句話說:你自己finish,他肯定不會調用的,必須是系統自己觸發的,

      比如

      1, 由於重力感應 手機從豎屏變為橫屏,

      2, 手機點擊Home鍵和長按Home鍵

      3, 點擊電源鍵鎖屏時

      4, 從當前Activity跳到另一個Activity

      5, 應用內存不足即將自動銷毀時

      2.onSaveInstanceState他保存的數據是持有化的,還是永久性的呢 onSaveInstanceState()這個方法適合臨時保存一些非永久性的數據.如果要持久化保存數據,就要將操作放在onStop(), onDestroy()這些方法中去   這樣來看onSaveInstanceState()的作用就是: onSaveInstanceState()適合的是當前Activity或者Fragment一旦被系統自己銷毀,應用還能在這之前保存一些必要的數據, 並且用戶的操作很快又回到當前這個頁面,這個時候數據並沒有丟失,還能最大程度的恢復之前狀態.這就是這個方法最大的意義   3.怎麼復寫的問題,也就是怎麼自己保存自己的數據了,使用的是bundle模式,也即是key-value模式了 因為在android的設計中中,這個函數的主要的作用是用來保存UI狀態的,現在怎麼去保存一些自己的數據呢 保存:
      @Override
      public void onSaveInstanceState(Bundle outState){
             super.onSaveInstanceState(outState);
             String content = etCon.getText().toString();
             outState.putString("inputCon", content);
      }
      取出來:
      @Override
      public void onViewStateRestored(Bundle savedInstanceState){
      	super.onViewStateRestored(savedInstanceState);
      	//恢復之前輸入框的內容
      	if(savedInstanceState != null){
      		etCon.setText(savedInstanceState.getString("inputCon", ""));
      	}
      }
        狀態保存主要的使用除了橫豎屏切換,在 fragment替換的時候可以用來解決花屏的問題。

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