一.Activity的方法的介紹
onCreate : 該方法是在Activity被創(chuàng)建時(shí)回調(diào),它是生命周期第一個(gè)調(diào)用的方法,我們?cè)趧?chuàng)建Activity時(shí)一般都需要重寫(xiě)該方法,然后在該方法中做一些初始化的操作,如通過(guò)setContentView設(shè)置界面布局的資源,初始化所需要的組件信息等。
onStart : 此方法被回調(diào)時(shí)表示Activity正在啟動(dòng),此時(shí)Activity已處于可見(jiàn)狀態(tài),只是還沒(méi)有在前臺(tái)顯示,因此無(wú)法與用戶(hù)進(jìn)行交互??梢院?jiǎn)單理解為Activity已顯示而我們無(wú)法看見(jiàn)擺了。
onResume : 當(dāng)此方法回調(diào)時(shí),則說(shuō)明Activity已在前臺(tái)可見(jiàn),可與用戶(hù)交互了(處于前面所說(shuō)的Active/Running形態(tài)),onResume方法與onStart的相同點(diǎn)是兩者都表示Activity可見(jiàn),只不過(guò)onStart回調(diào)時(shí)Activity還是后臺(tái)無(wú)法與用戶(hù)交互,而onResume則已顯示在前臺(tái),可與用戶(hù)交互。當(dāng)然從流程圖,我們也可以看出當(dāng)Activity停止后(onPause方法和onStop方法被調(diào)用),重新回到前臺(tái)時(shí)也會(huì)調(diào)用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。
onPause : 此方法被回調(diào)時(shí)則表示Activity正在停止(Paused形態(tài)),一般情況下onStop方法會(huì)緊接著被回調(diào)。但通過(guò)流程圖我們還可以看到一種情況是onPause方法執(zhí)行后直接執(zhí)行了onResume方法,這屬于比較極端的現(xiàn)象了,這可能是用戶(hù)操作使當(dāng)前Activity退居后臺(tái)后又迅速地再回到到當(dāng)前的Activity,此時(shí)onResume方法就會(huì)被回調(diào)。當(dāng)然,在onPause方法中我們可以做一些數(shù)據(jù)存儲(chǔ)或者動(dòng)畫(huà)停止或者資源回收的操作,但是不能太耗時(shí),因?yàn)檫@可能會(huì)影響到新的Activity的顯示——onPause方法執(zhí)行完成后,新Activity的onResume方法才會(huì)被執(zhí)行。
onStop : 一般在onPause方法執(zhí)行完成直接執(zhí)行,表示Activity即將停止或者完全被覆蓋(Stopped形態(tài)),此時(shí)Activity不可見(jiàn),僅在后臺(tái)運(yùn)行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時(shí))。
onRestart :表示Activity正在重新啟動(dòng),當(dāng)Activity由不可見(jiàn)變?yōu)榭梢?jiàn)狀態(tài)時(shí),該方法被回調(diào)。這種情況一般是用戶(hù)打開(kāi)了一個(gè)新的Activity時(shí),當(dāng)前的Activity就會(huì)被暫停(onPause和onStop被執(zhí)行了),接著又回到當(dāng)前Activity頁(yè)面時(shí),onRestart方法就會(huì)被回調(diào)。
onDestroy :此時(shí)Activity正在被銷(xiāo)毀,也是生命周期最后一個(gè)執(zhí)行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。
下面我們通過(guò)程序來(lái)驗(yàn)證上面流程中的幾種比較重要的情況,同時(shí)觀察生命周期方法的回調(diào)時(shí)機(jī)。
二、方法之間的區(qū)別
1.?onCreate和onStart之間有什么區(qū)別?
(1)可見(jiàn)與不可見(jiàn)的區(qū)別。前者不可見(jiàn),后者可見(jiàn)。
(2)執(zhí)行次數(shù)的區(qū)別。onCreate方法只在Activity創(chuàng)建時(shí)執(zhí)行一次,而onStart方法在Activity的切換以及按Home鍵返回桌面再切回應(yīng)用的過(guò)程中被多次調(diào)用。因此Bundle數(shù)據(jù)的恢復(fù)在onStart中進(jìn)行比onCreate中執(zhí)行更合適。
(3)onCreate能做的事onStart其實(shí)都能做,但是onstart能做的事onCreate卻未必適合做。如前文所說(shuō)的,setContentView和資源初始化在兩者都能做,然而想動(dòng)畫(huà)的初始化在onStart中做比較好。
2.onStart方法和onResume方法有什么區(qū)別?
(1)是否在前臺(tái)。onStart方法中Activity可見(jiàn)但不在前臺(tái),不可交互,而在onResume中在前臺(tái)。
(2)職責(zé)不同,onStart方法中主要還是進(jìn)行初始化工作,而onResume方法,根據(jù)官方的建議,可以做開(kāi)啟動(dòng)畫(huà)和獨(dú)占設(shè)備的操作。
3.onPause方法和onStop方法有什么區(qū)別?
(1)是否可見(jiàn)。onPause時(shí)Activity可見(jiàn),onStop時(shí)Activity不可見(jiàn),但Activity對(duì)象還在內(nèi)存中。
(2)在系統(tǒng)內(nèi)存不足的時(shí)候可能不會(huì)執(zhí)行onStop方法,因此程序狀態(tài)的保存、獨(dú)占設(shè)備和動(dòng)畫(huà)的關(guān)閉、以及一些數(shù)據(jù)的保存最好在onPause中進(jìn)行,但要注意不能太耗時(shí)。
4.onStop方法和onDestroy方法有什么區(qū)別?
onStop階段Activity還沒(méi)有被銷(xiāo)毀,對(duì)象還在內(nèi)存中,此時(shí)可以通過(guò)切換Activity再次回到該Activity,而onDestroy階段Acivity被銷(xiāo)毀
? 1.為什么切換Activity時(shí)各方法的執(zhí)行次序是(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop而不是(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
(1)一個(gè)Activity或多或少會(huì)占有系統(tǒng)資源,而在官方的建議中,onPause方法將會(huì)釋放掉很多系統(tǒng)資源,為切換Activity提供流暢性的保障,而不需要再等多兩個(gè)階段,這樣做切換更快。
(2)按照生命周期圖的表示,如果用戶(hù)在切換Activity的過(guò)程中再次切回原Activity,是在onPause方法后直接調(diào)用onResume方法的,這樣比onPause→onStop→onRestart→onStart→onResume要快得多。
2.與生命周期密切相關(guān)的onSaveInstanceState方法和onRestoreInstanceState方法在什么時(shí)候執(zhí)行?
通過(guò)閱讀源碼會(huì)發(fā)現(xiàn),當(dāng)targetSdkVersion小于3時(shí)onSaveInstanceState是在onPause方法中調(diào)用的,而大于3時(shí)是在onStop方法中調(diào)用的。
而onRestoreInstanceState是在onStart之后、onResume之前調(diào)用的。