一.Activity的方法的介紹
onCreate : 該方法是在Activity被創(chuàng)建時回調(diào)沟优,它是生命周期第一個調(diào)用的方法燃箭,我們在創(chuàng)建Activity時一般都需要重寫該方法劣像,然后在該方法中做一些初始化的操作含懊,如通過setContentView設(shè)置界面布局的資源豹悬,初始化所需要的組件信息等桐筏。
onStart : 此方法被回調(diào)時表示Activity正在啟動范抓,此時Activity已處于可見狀態(tài)骄恶,只是還沒有在前臺顯示,因此無法與用戶進行交互匕垫∩常可以簡單理解為Activity已顯示而我們無法看見擺了。
onResume : 當此方法回調(diào)時象泵,則說明Activity已在前臺可見寞秃,可與用戶交互了(處于前面所說的Active/Running形態(tài)),onResume方法與onStart的相同點是兩者都表示Activity可見偶惠,只不過onStart回調(diào)時Activity還是后臺無法與用戶交互春寿,而onResume則已顯示在前臺,可與用戶交互洲鸠。當然從流程圖堂淡,我們也可以看出當Activity停止后(onPause方法和onStop方法被調(diào)用),重新回到前臺時也會調(diào)用onResume方法扒腕,因此我們也可以在onResume方法中初始化一些資源绢淀,比如重新初始化在onPause或者onStop方法中釋放的資源。
onPause : 此方法被回調(diào)時則表示Activity正在停止(Paused形態(tài))瘾腰,一般情況下onStop方法會緊接著被回調(diào)皆的。但通過流程圖我們還可以看到一種情況是onPause方法執(zhí)行后直接執(zhí)行了onResume方法,這屬于比較極端的現(xiàn)象了蹋盆,這可能是用戶操作使當前Activity退居后臺后又迅速地再回到到當前的Activity费薄,此時onResume方法就會被回調(diào)。當然栖雾,在onPause方法中我們可以做一些數(shù)據(jù)存儲或者動畫停止或者資源回收的操作楞抡,但是不能太耗時,因為這可能會影響到新的Activity的顯示——onPause方法執(zhí)行完成后析藕,新Activity的onResume方法才會被執(zhí)行召廷。
onStop : 一般在onPause方法執(zhí)行完成直接執(zhí)行,表示Activity即將停止或者完全被覆蓋(Stopped形態(tài)),此時Activity不可見竞慢,僅在后臺運行先紫。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)筹煮。
onRestart :表示Activity正在重新啟動遮精,當Activity由不可見變?yōu)榭梢姞顟B(tài)時,該方法被回調(diào)败潦。這種情況一般是用戶打開了一個新的Activity時本冲,當前的Activity就會被暫停(onPause和onStop被執(zhí)行了),接著又回到當前Activity頁面時变屁,onRestart方法就會被回調(diào)眼俊。
onDestroy :此時Activity正在被銷毀,也是生命周期最后一個執(zhí)行的方法粟关,一般我們可以在此方法中做一些回收工作和最終的資源釋放。
下面我們通過程序來驗證上面流程中的幾種比較重要的情況环戈,同時觀察生命周期方法的回調(diào)時機闷板。
二、方法之間的區(qū)別
1.?onCreate和onStart之間有什么區(qū)別院塞?
(1)可見與不可見的區(qū)別遮晚。前者不可見,后者可見拦止。
(2)執(zhí)行次數(shù)的區(qū)別县遣。onCreate方法只在Activity創(chuàng)建時執(zhí)行一次,而onStart方法在Activity的切換以及按Home鍵返回桌面再切回應(yīng)用的過程中被多次調(diào)用汹族。因此Bundle數(shù)據(jù)的恢復(fù)在onStart中進行比onCreate中執(zhí)行更合適萧求。
(3)onCreate能做的事onStart其實都能做,但是onstart能做的事onCreate卻未必適合做顶瞒。如前文所說的夸政,setContentView和資源初始化在兩者都能做,然而想動畫的初始化在onStart中做比較好榴徐。
2.onStart方法和onResume方法有什么區(qū)別守问?
(1)是否在前臺。onStart方法中Activity可見但不在前臺坑资,不可交互耗帕,而在onResume中在前臺。
(2)職責不同袱贮,onStart方法中主要還是進行初始化工作仿便,而onResume方法,根據(jù)官方的建議,可以做開啟動畫和獨占設(shè)備的操作探越。
3.onPause方法和onStop方法有什么區(qū)別狡赐?
(1)是否可見。onPause時Activity可見钦幔,onStop時Activity不可見枕屉,但Activity對象還在內(nèi)存中。
(2)在系統(tǒng)內(nèi)存不足的時候可能不會執(zhí)行onStop方法鲤氢,因此程序狀態(tài)的保存搀擂、獨占設(shè)備和動畫的關(guān)閉、以及一些數(shù)據(jù)的保存最好在onPause中進行卷玉,但要注意不能太耗時哨颂。
4.onStop方法和onDestroy方法有什么區(qū)別?
onStop階段Activity還沒有被銷毀相种,對象還在內(nèi)存中威恼,此時可以通過切換Activity再次回到該Activity,而onDestroy階段Acivity被銷毀
? 1.為什么切換Activity時各方法的執(zhí)行次序是(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop而不是(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
(1)一個Activity或多或少會占有系統(tǒng)資源寝并,而在官方的建議中箫措,onPause方法將會釋放掉很多系統(tǒng)資源,為切換Activity提供流暢性的保障衬潦,而不需要再等多兩個階段斤蔓,這樣做切換更快。
(2)按照生命周期圖的表示镀岛,如果用戶在切換Activity的過程中再次切回原Activity弦牡,是在onPause方法后直接調(diào)用onResume方法的,這樣比onPause→onStop→onRestart→onStart→onResume要快得多漂羊。
2.與生命周期密切相關(guān)的onSaveInstanceState方法和onRestoreInstanceState方法在什么時候執(zhí)行驾锰?
通過閱讀源碼會發(fā)現(xiàn),當targetSdkVersion小于3時onSaveInstanceState是在onPause方法中調(diào)用的拨与,而大于3時是在onStop方法中調(diào)用的稻据。
而onRestoreInstanceState是在onStart之后、onResume之前調(diào)用的买喧。