共有七個(gè)周期函數(shù):onCreate()局蚀、onStart()彻桃、onResume()急但、onPause()澎媒、onStop()、onRestart()波桩、onDestroy().
七個(gè)周期函數(shù)解析
- onCreate(): 創(chuàng)建Activity時(shí)調(diào)用戒努,設(shè)置在該方法中,還以Bundle的形式提供對(duì)以前存儲(chǔ)的任何狀態(tài)的訪問(wèn)镐躲。
- onStart(): Activity變?yōu)樵谄聊簧蠈?duì)用戶(hù)可見(jiàn)時(shí)調(diào)用储玫。
- onResume(): Activity開(kāi)始與用戶(hù)交互時(shí)調(diào)用(無(wú)論是啟動(dòng)還是重新啟動(dòng)一個(gè)活動(dòng),該方法總是被調(diào)用萤皂。
- onPause(): Activity被暫腿銮睿或收回cpu和其他資源時(shí)調(diào)用,該方法用戶(hù)保護(hù)活動(dòng)狀態(tài)的敌蚜,也是保護(hù)現(xiàn)場(chǎng)桥滨。
- onStop(): Activity被停止并轉(zhuǎn)為不可見(jiàn)階段及后續(xù)的生命周期事件時(shí)調(diào)用。
- onRestart(): Activity被重新啟動(dòng)時(shí)調(diào)用弛车。該活動(dòng)仍然在棧中齐媒,而不是啟動(dòng)新的Activity。
- onDestroy():當(dāng)前Activity結(jié)束或正在被系統(tǒng)銷(xiāo)毀纷跛、資源空間等就被回收喻括。
不同場(chǎng)景下Activity生命周期的變化過(guò)程
- 啟動(dòng)Activity: onCreate()—>onStart()—>onResume(),Activity進(jìn)入運(yùn)行狀態(tài)贫奠。
- Activity退居后臺(tái): 當(dāng)前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏: onPause()—>onStop()唬血,進(jìn)入停滯狀態(tài)望蜡。
- Activity返回前臺(tái): onRestart()—>onStart()—>onResume(),再次回到運(yùn)行狀態(tài)拷恨。
- Activity退居后臺(tái)脖律,且系統(tǒng)內(nèi)存不足, 系統(tǒng)會(huì)殺死這個(gè)后臺(tái)狀態(tài)的Activity腕侄,若再次回到這個(gè)Activity,則會(huì)走onCreate()–>onStart()—>onResume()
- 鎖定屏與解鎖屏幕只會(huì)調(diào)用onPause()小泉,而不會(huì)調(diào)用onStop方法,開(kāi)屏后則調(diào)用onResume()
-
退出當(dāng)前Activity:onPause()->onStop()->onDestory()冕杠。
彈出Toast和AlertDialog的時(shí)候Activity的生命周期不會(huì)有改變
橫豎屏切換對(duì)Activity生命周期的影響
onSaveInstanceState()和onRestoreInstanceState():
1.不是activity生命周期的方法微姊。
2.不會(huì)成對(duì)出現(xiàn)。
注意:android2.3和android4.0的生命周期不一樣分预,2.3是先onSaveInstanceState兢交,后onPause,4.0是先onPause笼痹,后onSaveInstanceState
- 橫豎屏切換與android:configChanges屬性有關(guān)配喳,android:configChanges="orientation|screenSize|keyboardHidden",在2.3和4.0及以上Activity都不會(huì)重新創(chuàng)建与倡。
android:configChanges屬性值有:
1)orientation:消除橫豎屏的影響
2)keyboardHidden:消除鍵盤(pán)的影響
3)screenSize:消除屏幕大小的影響
4)……- 禁止橫豎屏切換:
android:screenOrientation="portrait" 只能豎屏顯示android:screenOrientation="landscape"只能橫屏顯示界逛。
Java代碼:
Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);以豎屏顯示Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);以橫屏顯示- Activity沒(méi)有重建時(shí),就會(huì)調(diào)用onConfigurationChanged函數(shù)
-
沒(méi)有設(shè)置configChanges屬性:
onPause()->
onSaveInstanceState()->
onStop()->
onDestory()->
onCreate()->
onStart()->
onRestoreInstanceState()->
onResume()
Activity生命周期的變化與數(shù)據(jù)保存和恢復(fù)
onSaveInstanceState()特點(diǎn):
并不是永遠(yuǎn)都會(huì)被調(diào)用纺座,并不是每次銷(xiāo)毀時(shí)都會(huì)被調(diào)用
在onStop()方法之前被調(diào)用息拜,但不保證會(huì)在onPause()方法之前還是之后被調(diào)用。
以下行為不會(huì)被調(diào)用:
1)執(zhí)行finish()方法净响;
2)主動(dòng)按Back鍵少欺。以下行為會(huì)被調(diào)用:
1)跳轉(zhuǎn)另一個(gè)Activity,且沒(méi)有用finish()函數(shù)馋贤;
2)長(zhǎng)時(shí)間在后臺(tái)也沒(méi)有顯示出來(lái)赞别;
3)內(nèi)存緊張被kill掉;
4)用戶(hù)直接按home鍵配乓。
在沒(méi)有重寫(xiě)onSaveInstanceState()函數(shù)時(shí)仿滔,activity控件的狀態(tài)(如EditText輸入的文字)可能會(huì)默認(rèn)保存,前提條件是UI控件必須賦了id犹芹。
總結(jié):
- 持久性的數(shù)據(jù):在onPause()崎页,onStop()以及onDestroy()中保存。
- 非持久性的數(shù)據(jù):在onSaveInstanceState()保存腰埂。