日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Activity的缓存方法

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
  • protected?void?onCreate(Bundle?savedInstanceState){??
  • ????super.onCreate(savedInstanceState);??
  • ????setContentView(R.layout.activity_main);??
  • ????//??????當activity第一次被創建的時候為空??
  • ????//??????所以我們來判斷一下??
  • ????if(savedInstanceState?!=?null){??
  • ????????savedInstanceState.getString("anAnt");??
  • }??
  • protected?void?onSaveInstanceState(Bundle?outState){??
  • super.onSaveInstanceState(outState);??
  • outState.putString("anAnt","Android");??
  • }??
  • 一、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
  • public?void?onSaveInstanceState(Bundle?savedInstanceState){??
  • ????savedInstanceState.putBoolean("MyBoolean",true);??
  • ????saveInstanceState.putDouble("MyDouble",1.9);??
  • ????savedInstanceState.putInt("MyInt",1);??
  • ????savedInstanceState.putString("MyString","Android");??
  • ????super.onSaveInstanceState(savedInstanceState);??
  • }??
  • public?void?onRestoreInstanceState(Bundle?savedInstanceState){??
  • ????super.onRestoreInstanceState(savedRestoreInstanceState);??
  • ????boolean?myBoolean?=?saveInstanceState.getBoolean("MyBoolean");??
  • ????double?myDouble?=?saveInstanceState.getDouble("MyDouble");??
  • ????int?myInt?=?saveInstanceState.getInt("MyInt");??
  • }??
  • ????protected?void?onCreate(Bundle?savedInstanceState){??
  • ????super.onCreate(savedInstanceState);??
  • ????setContentView(R.layout.activity_main);??
  • ????//??????當activity第一次被創建的時候為空??
  • ????//??????所以我們來判斷一下??
  • ????if(savedInstanceState?!=?null){??
  • ????????savedInstanceState.getString("anAnt");??
  • ????}??
  • }??
  • 總結

    以上是生活随笔為你收集整理的Activity的缓存方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。