Android基礎部分再學習---activity的狀態保存
主要是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
![技術分享](https://code.csdn.net/assets/CODE_ico.png)
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
Log.d("roamer"
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Log.d("roamer", "onCreate");
- }
- @Override
-
protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- Log.d("roamer", "onRestoreInstanceState");
- }
步驟例如以下圖:
註意:並非每一次Activity銷毀。系統都回去回調onSaveInstanceState()方法,我們是我們自己finish掉該Activity,那麽onSaveInstanceState()方法就不會被調用。
而且系統調用onSaveInstanceState()方法的時機通常是在onStop()之前,可是也有可能是onPause之前。
而且系統調用onRestoreInstanceState()的時機。是在onStart()之後,onResume之前。
Activity狀態保存的默認機制
然而。即使我們不重寫onSaveInstanceState()方法。Activity對於onSaveInstanceState()方法的默認實現。仍然會幫我們恢復某些狀態。詳細來說,默認的實現會幫我們調用該Activity布局中每一個View的onSaveInstanceState()方法。View中的onSaveInstanceState()方法體例如以下: [java] view plain copy![技術分享](https://code.csdn.net/assets/CODE_ico.png)
- //View的onRestoreInstanceState()方法
- //該方法同意每一個View提供自己須要保存的信息
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- // TODO Auto-generated method stub
- super.onRestoreInstanceState(state);
- }
差點兒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的狀態保存