Activity的缓存方法
轉載地址:http://blog.csdn.net/zhichu_2025/article/details/52047605
有a、b兩個activity,當a進入b之后的一段時間,可能系統就把a回收了,這時候按back鍵,執行的不是a的onStart()方法,而是onCreate()方法,a被重新創建了一次,這時a的臨時數據和狀態就很有可能就丟失了。
而Activity中的onSaveInstanceState()回調方法會保存臨時的數據和狀態,這個方法一定會再activity回收之前調用。方法中有一個Bundle參數,putString()、putInt()等方法需要傳入兩個參數,一個鍵一個值。數據保存之后會在onCreate中會恢復,onCreate也有一個Bundle類型的參數。
示例代碼:
[java]?view plaincopy
一、onSaveInstanceState(Bundle outState) ? ?用來保存狀態
當某個activity變得“”容易“被系統銷毀時,該activity的onSaveInstanceState()就會被執行,除非這個activity是被用戶主動銷毀的,例如用戶按BACK鍵時。
“容易”被銷毀時什么意思呢??
言下之意就是此時的activity還沒有被銷毀,而僅僅是一種可能性,這種可能性有哪些呢??通過重寫一個activity的所有生命周期的onXXX()方法,包括onSaveInstanceState()和onRestoreInstanceState()方法,我們可以清楚的知道某個activity(假設為activity A)顯示在當前task的最上層,其onSaveInstanceState()方法會在什么時候被執行,有這么幾種情況:
1、當用戶按下HOME鍵時。這是顯而易見的,系統不知道當你按下HOME后要運行多少個其他的程序,自然也不知道activity A是否會被銷毀,故系統會調用onSaveInstanceState,讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則
2、長按HOME鍵,選擇運行其他的程序時
3、按下電源按鍵(關閉屏幕顯示)時
4、從一個activity A中啟動一個新的activity時
5、屏幕方向切換時,l例如從豎屏切換到橫屏時。(如果不指定configchange屬性)在屏幕切換之前,系統會銷毀activity A,在切換之后系統又會自動地創建activity A,所以onSavaInstanceState一定會被執行
總而言之,onSaveInstanceState的調用遵循一個重要原則,就是系統未經你允許就銷毀你的activity,那么onSaveInstanceState一定會被系統調用,這是系統的責任,因為它必須要提供一個機會讓你保存你的數據。另外,注意幾點:
? ? ? ? 1.布局中的每一個view默認實現了onSaveInstanceState()方法,這樣的話,這個UI的任何改變都會自動的存儲和在activity重新創建的時候自動恢復。但是這個情況只有你為這個UI提供了唯一的ID之后才會起作用,如果沒有ID,則不會存儲它的狀態
2.由于默認的onSaveInstanceState()方法實現了幫助UI存儲它的狀態,所以如果你需要覆蓋這個方法去存儲額外的狀態信息時,你應該在執行任何代碼之前都調用父類的onSaveInstanceState()方法,(super.onSaveInstanceState).
既然有現成的可以用,那我們到底要不要自己來實現onSaveInstanceState()方法呢??這個分情況而定,如果你自己的派生類中有變量影響到UI,或是你程序的行為,當然也要把這個變量也保存了,那么就需要自己實現,否則不需要。
3.由于onSaveInstanceState()方法調用的不可確定性,你應該只使用這個方法去記錄activity的瞬間狀態(UI的狀態),不應該用這個方法去存儲持久化數據。當用戶離開這個activity的時候應該在onPause()方法中存儲持久化數據(例如應該被存儲到數據庫中的數據)
4.onSaveInstanceState()如果被調用,這個方法會在onStop()前被觸發,但是系統并不保證是否在onPause()之前或者是之后觸發
二、onRestoreInstanceState(Bundle outState) ? 用來恢復數據
需要注意的是,onSaveInstanceState和onRestoreInstanceState并不一定是成對被調用的
onRestoreInstanceState()被調用的前提是,activity A 確實已經被銷毀了,而如果僅僅是停留在可能情況下,那么該方法不會被調用。
例如,正在顯示activity A 的時候,按下HOME鍵回到了主界面,然后緊接著又返回activity A,這種情況下,活動一般不會因為內存的原因而被系統銷毀,故onRestoreInstanceState方法不會執行。
另外,onRestoreInstanceState的bundle參數也會傳到onCreate()中,你也可以選擇在onCreate()方法中做數據還原。此方法在onStart()方法之后執行。
? ?以下的兩個函數的使用,注意調用super的前后!!!!
[java]?view plaincopy
總結
以上是生活随笔為你收集整理的Activity的缓存方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯帮助警方破获 30+ 起吃鸡外挂案件
- 下一篇: EPOLL模型