【移動應用開發(fā)技術(shù)】Android編程實現(xiàn)狀態(tài)保存的方法分析_第1頁
【移動應用開發(fā)技術(shù)】Android編程實現(xiàn)狀態(tài)保存的方法分析_第2頁
【移動應用開發(fā)技術(shù)】Android編程實現(xiàn)狀態(tài)保存的方法分析_第3頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術(shù)】Android編程實現(xiàn)狀態(tài)保存的方法分析

本文實例講述了Android編程實現(xiàn)狀態(tài)保存的方法。分享給大家供大家參考,具體如下:1、當我們正在發(fā)短信的時候,已經(jīng)寫了幾百字了,這時突然來了一個電話,我們接完電話之后,如果發(fā)現(xiàn)辛辛苦苦的幾百字不見了,那可就火大了,而實際上這些內(nèi)容都是保存了的。在我們接電話的過程中,我們發(fā)信息的那個Activity是可能會被系統(tǒng)回收的,這時會調(diào)用Activity的onSaveInstanceState回調(diào)方法,而我們就可以在這個方法中保存狀態(tài)數(shù)據(jù),在onCreate方法或者在2.0之后提供的回調(diào)方法onRestoreInstanceState中進行狀態(tài)數(shù)據(jù)恢復。2、當我們在玩游戲的時候,可能又想聽歌,然后我們會按home或者back鍵退出游戲去啟動音樂,然后再回到游戲,當我們回到游戲的時候,發(fā)現(xiàn)剛剛的狀態(tài)還是被保存的。這種情況,我們可以這樣保存狀態(tài)。在onPause方法中保存狀態(tài)數(shù)據(jù),在onResume方法中進行狀態(tài)恢復。activity的狀態(tài)是被保留在內(nèi)存中的,當resume時,它會立即開始執(zhí)行。當用戶在開啟一個新activity時,當前的activity可能在內(nèi)存中處于停止狀態(tài)也可能由于新activity需要更多內(nèi)存而被系統(tǒng)殺掉了,但不論怎樣,當用戶在新activity上按返回鍵時,他希望看到的是原先的activity的界面。原先的activity如果是被重新創(chuàng)建,那么它要恢復到用戶最后看到它的樣子。那么我們怎么做呢?其實也不難,跟據(jù)上一節(jié)所述,在onPause()或onStop()或onDestyroy()中保存必要的數(shù)據(jù)就行了。但是現(xiàn)在google又冒出一個新的東西:onSaveInstanceState(),觀其名可知其意:它是專門用來保存實例狀態(tài)的,這個“實例”不是指的activity對象,而是它所在的進程,因為activity的銷毀是因為它所在的進程被殺而造成的。onSaveInstanceState()是在系統(tǒng)感覺需要殺死activity時調(diào)用的,它被傳入一個參數(shù):Bundle,這個Bundle可以被認為是個map,字典之類的東西,用”鍵-值”來保存數(shù)據(jù)。那么什么狀態(tài)叫做感覺要被殺死呢?官方文檔原話:AndroidcallsonSaveInstanceState()beforetheactivitybecomesvulnerabletobeingdestroyedbythesystem,butdoesnotbothercallingitwhentheinstanceisactuallybeingdestroyedbyauseraction(suchaspressingtheBACKkey)從這句話可以知道,當某個activity變得“容易”被系統(tǒng)銷毀時,該activity的onSaveInstanceState就會被執(zhí)行,除非該activity是被用戶主動銷毀的,例如當用戶按BACK鍵的時候。注意上面的雙引號,何為“容易”?言下之意就是該activity還沒有被銷毀,而僅僅是一種可能性。這種可能性有哪些?通過重寫一個activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我們可以清楚地知道當某個activity(假定為activityA)顯示在當前task的最上層時,其onSaveInstanceState方法會在什么時候被執(zhí)行,有這么幾種情況:1、當用戶按下HOME鍵時。這是顯而易見的,系統(tǒng)不知道你按下HOME后要運行多少其他的程序,自然也不知道activityA是否會被銷毀,故系統(tǒng)會調(diào)用onSaveInstanceState,讓用戶有機會保存某些非永久性的數(shù)據(jù)。以下幾種情況的分析都遵循該原則

2、長按HOME鍵,選擇運行其他的程序時。

3、按下電源按鍵(關閉屏幕顯示)時。

4、從activityA中啟動一個新的activity時。

5、屏幕方向切換時,例如從豎屏切換到橫屏時。在屏幕切換之前,系統(tǒng)會銷毀activityA,在屏幕切換之后系統(tǒng)又會自動地創(chuàng)建activityA,所以onSaveInstanceState一定會被執(zhí)行

總而言之,onSaveInstanceState的調(diào)用遵循一個重要原則,即當系統(tǒng)“未經(jīng)你許可”時銷毀了你的activity,則onSaveInstanceState會被系統(tǒng)調(diào)用,這是系統(tǒng)的責任,因為它必須要提供一個機會讓你保存你的數(shù)據(jù)(當然你不保存那就隨便你了)。至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調(diào)用的。onRestoreInstanceState被調(diào)用的前提是,activityA“確實”被系統(tǒng)銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調(diào)用,例如,當正在顯示activityA的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activityA,這種情況下activityA一般不會因為內(nèi)存的原因被系統(tǒng)銷毀,故activityA的onRestoreInstanceState方法不會被執(zhí)行另外,onRestoreInstanceState的bundle參數(shù)也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數(shù)據(jù)還原。那么,不是可以在onPause()中保存數(shù)據(jù)嗎?為什么又搞出這樣一個家伙來?它們之間是什么關系呢?原來onSaveInstanceState()的主要目的是保存activity的狀態(tài)有關的數(shù)據(jù),當系統(tǒng)在殺死activity時,如果它希望activity下次出現(xiàn)的樣子跟現(xiàn)在完全一樣,那么它就調(diào)用這個onSaveInstanceState(),否則就不調(diào)用。所以要明白這一點:onSaveInstanceState()并不是永遠都會調(diào)用。比如,當用戶在一個activity上按返回時,就不會調(diào)用,因為用戶此時明確知道這個activity是要被銷毀的,并不期望下次它的樣子跟現(xiàn)在一樣(當然開發(fā)者可以使它保持臨死時的表情,你非要這樣做,系統(tǒng)也沒辦法),所以就不用調(diào)用onSaveInstanceState()。現(xiàn)在應該明白了:在onPause(),onStop()以及onDestroy()中需要保存的是那些需要永久化是數(shù)據(jù),而不是保存用于恢復狀態(tài)的數(shù)據(jù),狀態(tài)數(shù)據(jù)有專門的方法:onSaveInstanceState()。數(shù)據(jù)保存在一個Bundle中,Bundle被系統(tǒng)永久化。當再調(diào)用activity的onCreate()時,原先保存的bundle就被傳入,以恢復上一次臨死時的模樣,如果上次死時沒有保存Bundle,則為null。還沒完呢,如果你沒有實現(xiàn)自己的onSaveInstanceState(),但是activity上控件的樣子可能依然能被保存并恢復。原來activity類已實現(xiàn)了onSaveInstanceState(),在onSaveInstanceState()的默認實現(xiàn)中,會調(diào)用所有控件的相關方法,把控件們的狀態(tài)都保存下來,比如EditText中輸入的文字,CheckBox是否被選中等等。然而不是所有的控件都能被保存,這取決于你是否在layout文件中為控件賦了一個名字(android:id)。有名的就存,無名的不管。既然有現(xiàn)成的可用,那么我們到底還要不要自己實現(xiàn)onSaveInstanceState()?這得看情況了,如果你自己的派生類中有變量影響到UI,或你程序的行為,當然就要把這個變量也保存了,那么就需要自己實現(xiàn),否則就不需要,但大多數(shù)情況肯定需要自己實現(xiàn)一下下了。對了,別忘了在你的實現(xiàn)中調(diào)用父類的onSaveInstanceState()。注:由于onSaveInstanceState()并不是每次銷毀時都會調(diào)用,所以不要在其中保存那些需要永久化的數(shù)據(jù),執(zhí)行保存那些數(shù)據(jù)的最好地方是:onPause()中。測試你程序的狀態(tài)恢復能力的最好方法是:旋轉(zhuǎn)屏幕,每當屏幕的方向改變時,當前的activity就會被系統(tǒng)銷毀,然后重新創(chuàng)建。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論