1. 程式人生 > >Android基礎部分再學習---activity的狀態保存

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

imp position 數據 -h 解決 tom import eva line

主要是bundle 這個參數

參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975

學習Activity的生命周期,我們知道,當Activity進入到paused或者stopped狀態後,這個Activity的狀態仍然保存著。

由於這個Activity對象仍然保存在內存中。它的全部信息和狀態仍然是存在的。當這個Activity再次返回到前臺是,它仍然保持著離開時候的樣子。

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

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

[java] view plain copy 技術分享技術分享
  1. @Override
  2. protected void onSaveInstanceState(Bundle outState) {
  3. super.onSaveInstanceState(outState);
  4. Log.d("roamer"
    , "onSaveInstanceState");
  5. }
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. Log.d("roamer", "onCreate");
  11. }
  12. @Override
  13. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  14. super.onRestoreInstanceState(savedInstanceState);
  15. Log.d("roamer", "onRestoreInstanceState");
  16. }


通過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()方法體例如以下: [java] view plain copy 技術分享技術分享
  1. //View的onRestoreInstanceState()方法
  2. //該方法同意每一個View提供自己須要保存的信息
  3. @Override
  4. protected void onRestoreInstanceState(Parcelable state) {
  5. // TODO Auto-generated method stub
  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){
<span style="white-space:pre">	</span>super.onViewStateRestored(savedInstanceState);
<span style="white-space:pre">	</span>//恢復之前輸入框的內容
<span style="white-space:pre">	</span>if(savedInstanceState != null){
<span style="white-space:pre">		</span>etCon.setText(savedInstanceState.getString("inputCon", ""));
	}
}


狀態保存基本的使用除了橫豎屏切換。在 fragment替換的時候能夠用來解決花屏的問題


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