Android Activity狀態(tài)保存機(jī)制知識(shí)分享_第1頁
Android Activity狀態(tài)保存機(jī)制知識(shí)分享_第2頁
Android Activity狀態(tài)保存機(jī)制知識(shí)分享_第3頁
Android Activity狀態(tài)保存機(jī)制知識(shí)分享_第4頁
Android Activity狀態(tài)保存機(jī)制知識(shí)分享_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Android Activity狀態(tài)保存機(jī)制-voidonCreate(BundlesavedInstanceState)當(dāng)Activity被第首次加載時(shí)執(zhí)行。我們新啟動(dòng)一個(gè)程序的時(shí)候其主窗體的onCreate事件就會(huì)被執(zhí)行。如果Activity被銷毀后(onDestroy后),再重新加載進(jìn)Task時(shí),其onCreate事件也會(huì)被重新執(zhí)行。注意這里的參數(shù)savedInstanceState(Bundle類型是一個(gè)鍵值對集合,大家可以看成是.Net中的Dictionary)是一個(gè)很有用的設(shè)計(jì),由于前面已經(jīng)

2、說到的手機(jī)應(yīng)用的特殊性,一個(gè)Activity很可能被強(qiáng)制交換到后臺(tái)(交換到后臺(tái)就是指該窗體不再對用戶可見,但實(shí)際上又還是存在于某個(gè)Task中的,比如一個(gè)新的Activity壓入了當(dāng)前的Task從而“遮蓋”住了當(dāng)前的Activity,或者用戶按了Home鍵回到桌面,又或者其他重要事件發(fā)生導(dǎo)致新的Activity出現(xiàn)在當(dāng)前Activity之上,比如來電界面),而如果此后用戶在一段時(shí)間內(nèi)沒有重新查看該窗體(Android通過長按Home鍵可以選擇最近運(yùn)行的6個(gè)程序,或者用戶直接再次點(diǎn)擊程序的運(yùn)行圖標(biāo),如果窗體所在的Task和進(jìn)程沒有被系統(tǒng)銷毀,則不用重新加載Process,Task和Task中的Ac

3、tivity,直接重新顯示Task頂部的Activity,這就稱之為重新查看某個(gè)程序的窗體),該窗體連同其所在的Task和Process則可能已經(jīng)被系統(tǒng)自動(dòng)銷毀了,此時(shí)如果再次查看該窗體,則要重新執(zhí)行onCreate事件初始化窗體。而這個(gè)時(shí)候我們可能希望用戶繼續(xù)上次打開該窗體時(shí)的操作狀態(tài)進(jìn)行操作,而不是一切從頭開始。例如用戶在編輯短信時(shí)突然來電,接完電話后用戶又去做了一些其他的事情,比如保存來電號(hào)碼到聯(lián)系人,而沒有立即回到短信編輯界面,導(dǎo)致了短信編輯界面被銷毀,當(dāng)用戶重新進(jìn)入短信程序時(shí)他可能希望繼續(xù)上次的編輯。這種情況我們就可以覆寫Activity的voidonSaveInstanceStat

4、e(BundleoutState)事件,通過向outState中寫入一些我們需要在窗體銷毀前保存的狀態(tài)或信息,這樣在窗體重新執(zhí)行onCreate的時(shí)候,則會(huì)通過savedInstanceState將之前保存的信息傳遞進(jìn)來,此時(shí)我們就可以有選擇的利用這些信息來初始化窗體,而不是一切從頭開始。2.voidonStart()onCreate事件之后執(zhí)行。或者當(dāng)前窗體被交換到后臺(tái)后,在用戶重新查看窗體前已經(jīng)過去了一段時(shí)間,窗體已經(jīng)執(zhí)行了onStop事件,但是窗體和其所在進(jìn)程并沒有被銷毀,用戶再次重新查看窗體時(shí)會(huì)執(zhí)行onRestart事件,之后會(huì)跳過onCreate事件,直接執(zhí)行窗體的onStart事件

5、。3.voidonResume()onStart事件之后執(zhí)行?;蛘弋?dāng)前窗體被交換到后臺(tái)后,在用戶重新查看窗體時(shí),窗體還沒有被銷毀,也沒有執(zhí)行過onStop事件(窗體還繼續(xù)存在于Task中),則會(huì)跳過窗體的onCreate和onStart事件,直接執(zhí)行onResume事件。4.voidonPause()窗體被交換到后臺(tái)時(shí)執(zhí)行。5.voidonStop()onPause事件之后執(zhí)行。如果一段時(shí)間內(nèi)用戶還沒有重新查看該窗體,則該窗體的onStop事件將會(huì)被執(zhí)行;或者用戶直接按了Back鍵,將該窗體從當(dāng)前Task中移除,也會(huì)執(zhí)行該窗體的onStop事件。6.voidonRestart()onStop事

6、件執(zhí)行后,如果窗體和其所在的進(jìn)程沒有被系統(tǒng)銷毀,此時(shí)用戶又重新查看該窗體,則會(huì)執(zhí)行窗體的onRestart事件,onRestart事件后會(huì)跳過窗體的onCreate事件直接執(zhí)行onStart事件。7.voidonDestroy()Activity被銷毀的時(shí)候執(zhí)行。在窗體的onStop事件之后,如果沒有再次查看該窗體,Activity則會(huì)被銷毀。最后用一個(gè)實(shí)際的例子來說明Activity的各個(gè)生命周期。假設(shè)有一個(gè)程序由2個(gè)ActivityA和B組成,A是這個(gè)程序的啟動(dòng)界面。當(dāng)用戶啟動(dòng)程序時(shí),Process和默認(rèn)的Task分別被創(chuàng)建,接著A被壓入到當(dāng)前的Task中,依次執(zhí)行了onCreate,on

7、Start,onResume事件被呈現(xiàn)給了用戶;此時(shí)用戶選擇A中的某個(gè)功能開啟界面B,界面B被壓入當(dāng)前Task遮蓋住了A,A的onPause事件執(zhí)行,B的onCreate,onStart,onResume事件執(zhí)行,呈現(xiàn)了界面B給用戶;用戶在界面B操作完成后,使用Back鍵回到界面A,界面B不再可見,界面B的onPause,onStop,onDestroy執(zhí)行,A的onResume事件被執(zhí)行,呈現(xiàn)界面A給用戶。此時(shí)突然來電,界面A的onPause事件被執(zhí)行,電話接聽界面被呈現(xiàn)給用戶,用戶接聽完電話后,又按了Home鍵回到桌面,打開另一個(gè)程序“聯(lián)系人”,添加了聯(lián)系人信息又做了一些其他的操作,此時(shí)界

8、面A不再可見,其onStop事件被執(zhí)行,但并沒有被銷毀。此后用戶重新從菜單中點(diǎn)擊了我們的程序,由于A和其所在的進(jìn)程和Task并沒有被銷毀,A的onRestart和onStart事件被執(zhí)行,接著A的onResume事件被執(zhí)行,A又被呈現(xiàn)給了用戶。用戶這次使用完后,按Back鍵返回到桌面,A的onPause,onStop被執(zhí)行,隨后A的onDestroy被執(zhí)行,由于當(dāng)前Task中已經(jīng)沒有任何Activity,A所在的Process的重要程度被降到很低,很快A所在的Process被系統(tǒng)結(jié)束。當(dāng)一個(gè)程序有多個(gè)activity時(shí),按back鍵,上一個(gè)activity會(huì)退出,怎么配備布置可以不退出?下次啟

9、動(dòng)它時(shí)他還是運(yùn)行的。另有就是主程序,怎么讓他在按back鍵時(shí)天然后臺(tái)?重寫返回按鈕事件publicvoidonBackPressed()此方法當(dāng)返回按鈕事件出發(fā)時(shí),體系會(huì)默許調(diào)用finish(),你直接return別讓體系調(diào)用就行,back鍵后臺(tái)參考源碼home的事件并重寫OverridepublicvoidonBackPressed()/這里處理邏輯代碼,該方法僅適用于2.0或更新版的sdkreturn;android的手機(jī)的back鍵默認(rèn)行為是finish處于前臺(tái)的Activity的即Activity的狀態(tài)為Destroy狀態(tài),再次啟動(dòng)該Activity是從onCreate開始的。而Hom

10、e鍵默認(rèn)是stop前臺(tái)的Activity即狀態(tài)為onStop而不是Destroy,若再次啟動(dòng)它,則是從OnResume開始的,即會(huì)保持上次Activityd的狀態(tài)。back鍵也有例外的,按back鍵不會(huì)關(guān)閉Activity的,比如播放音樂,按了back鍵之后仍可以繼續(xù)播放音樂,這是Music這支ap已經(jīng)重寫了back鍵的事件處理。為什么需要Home鍵和Back鍵呢?一個(gè)使得Activity為Stop一個(gè)使得為Destroy呢?我想原因的原因在于是android也是一個(gè)多任務(wù)的操作系統(tǒng),通過Home鍵切換不同的任務(wù),而通過back關(guān)閉任務(wù)中的某一個(gè)活動(dòng)。若仔細(xì)想想就覺得PC的多任務(wù)行為一樣的。詳

11、細(xì)的解說可以看官方文檔,也可以看看這文章:/content/09/1201/15/79031_10135626.shtml還有例子注意:點(diǎn)擊Back鍵后,activity會(huì)先去執(zhí)行finish(),然后執(zhí)行onDestroy();在樂phone的手機(jī)上開發(fā)應(yīng)用,它的左上角有一個(gè)“返回”按鈕,如果想在返回后把一些東西銷毀掉,可以重寫finish()方法。HYPERLINK/sirdonker/archive/2010/06/04/5647625.aspx/sirdonker/archive/2010/06/04/5647625.aspxAndroidActivity導(dǎo)航HYPERLINK/xir

12、ihanlin/archive/2009/08/05/1539420.html/xirihanlin/archive/2009/08/05/1539420.htmlAndroid保存Activity狀態(tài)HYPERLINK/cmdn/wiki/index.php?edition-view-6259-1.html/cmdn/wiki/index.php?edition-view-6259-1.html(onsaceInstance)HYPERLINK/blog/static/14601809320109261141571/blog/static/14601809320109261141571/An

13、droid保存Activity狀態(tài)如果你想保存Activity的信息(例如,類實(shí)例的變量)而又不需要和其它的組件共享的話,你可以調(diào)用Activity的getPreferences方法,不用指定一個(gè)Preference的名字。對返回的SharedPreference的訪問只限于調(diào)用的Activity;每個(gè)Activity支持一個(gè)不命名的SharedPreference對象。1、使用Activity的私有SharedPreference:對于保存Activity實(shí)例的變量來說,Android提供了一種替代SharedPreference的特殊方法。通過重寫Activity的onSaveInstan

14、ceState事件處理函數(shù),你可以使用它的Bundle參數(shù)來保存實(shí)例的值。保存數(shù)據(jù)的方法還是使用與在SharedPreference中相同的get和put方法。在完成Bundle的修改后,將其傳入父類的處理函數(shù)中,如下面的代碼片段所示:privatestaticfinalStringTEXTVIEW_STATE_KEY=“TEXTVIEW_STATE_KEY”;OverridepublicvoidonSaveInstanceState(BundleoutState)/RetrievetheViewTextViewmyTextView=(TextView)findViewById(R.id.my

15、TextView);/SaveitsstateoutState.putString(TEXTVIEW_STATE_KEY,myTextView.getText().toString();super.onSaveInstanceState(outState);2、onSaveInstanceState/*保存Activity銷毀前的一些狀態(tài)信息*seeandroid.app.Activity#onSaveInstanceState(android.os.Bundle)*/OverridepublicvoidonSaveInstanceState(BundleoutState)super.onSa

16、veInstanceState(outState);outState.putString(fileName,fileName);這個(gè)處理函數(shù)會(huì)在Activity的Active生命周期結(jié)束時(shí)觸發(fā),但僅在它不是顯式地結(jié)束(即異常結(jié)束)。因此,它一般用于確保在單個(gè)用戶會(huì)話中的Active生命周期間Activity狀態(tài)的一致性。如果一個(gè)會(huì)話期間,應(yīng)用程序被迫重啟,那么,保存的Bundle會(huì)傳入到onRestoreInstanceState和onCreate方法中。下面的片段顯示了如何從Bundle中提取值來更新Activity實(shí)例的狀態(tài):OverridepublicvoidonCreate(Bundleicicle)super.onCreate(icicle);setContentView(R.layout.main);TextViewmyTextView=(Text

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論