之前學習安卓的時候只是知道生命周期是什么,有哪幾個,但具體的詳細的東西卻不知道,后來看過《Android開發藝術探索》和大量博客之后,才覺得自己真正有點理解生命周期,本文是我對生命周期的認識的總結。
廢話少說先上圖。
相信學習安卓的人對這幅圖都很熟悉,這是安卓Activity的生命周期活動圖,詳細而直觀得表現了Activity各生命周期間的關系。下面我來通過問答的方式來談談我對它們的認識。
1.生命周期中各個方法的含義和作用
(1)onCreate:create表示創建,這是Activity生命周期的第一個方法,也是我們在android開發中接觸的最多的生命周期方法。它本身的作用是進行Activity的一些初始化工作,比如使用setContentView加載布局,對一些控件和變量進行初始化等。但也有很多人將很多與初始化無關的代碼放在這,其實這是不規范的。此時Activity還在后臺,不可見。所以動畫不應該在這里初始化,因為看不到……
(2)onStart:start表示啟動,這是Activity生命周期的第二個方法。此時Activity已經可見了,但是還沒出現在前臺,我們還看不到,無法與Activity交互。其實將Activity的初始化工作放在這也沒有什么問題,放在onCreate中是由于官方推薦的以及我們開發的習慣。
(3)onResume:resume表示繼續、重新開始,這名字和它的職責也相同。此時Activity經過前兩個階段的初始化已經蓄勢待發。Activity在這個階段已經出現在前臺并且可見了。這個階段可以打開獨占設備
(4)onPause:pause表示暫停,當Activity要跳到另一個Activity或應用正常退出時都會執行這個方法。此時Activity在前臺并可見,我們可以進行一些輕量級的存儲數據和去初始化的工作,不能太耗時,因為在跳轉Activity時只有當一個Activity執行完了onPause方法后另一個Activity才會啟動,而且android中指定如果onPause在500ms即0.5秒內沒有執行完畢的話就會強制關閉Activity。從生命周期圖中發現可以在這快速重啟,但這種情況其實很罕見,比如用戶切到下一個Activity的途中按back鍵快速得切回來。
(5)onStop:stop表示停止,此時Activity已經不可見了,但是Activity對象還在內存中,沒有被銷毀。這個階段的主要工作也是做一些資源的回收工作。
(6)onDestroy:destroy表示毀滅,這個階段Activity被銷毀,不可見,我們可以將還沒釋放的資源釋放,以及進行一些回收工作。
(7)onRestart:restart表示重新開始,Activity在這時可見,當用戶按Home鍵切換到桌面后又切回來或者從后一個Activity切回前一個Activity就會觸發這個方法。這里一般不做什么操作。
通過上面的了解我們發現其實Activity中的方法大都是兩兩對應的,只有onRestart方法散發著單身狗的清香。
那么相鄰的方法之間有什么區別呢?
2.onCreate和onStart之間有什么區別?
(1)可見與不可見的區別。前者不可見,后者可見。
(2)執行次數的區別。onCreate方法只在Activity創建時執行一次,而onStart方法在Activity的切換以及按Home鍵返回桌面再切回應用的過程中被多次調用。因此Bundle數據的恢復在onStart中進行比onCreate中執行更合適。
(3)onCreate能做的事onStart其實都能做,但是onstart能做的事onCreate卻未必適合做。如前文所說的,setContentView和資源初始化在兩者都能做,然而想動畫的初始化在onStart中做比較好。
3.onStart方法和onResume方法有什么區別?
(1)是否在前臺。onStart方法中Activity可見但不在前臺,不可交互,而在onResume中在前臺。
(2)職責不同,onStart方法中主要還是進行初始化工作,而onResume方法,根據官方的建議,可以做開啟動畫和獨占設備的操作。
4.onPause方法和onStop方法有什么區別?
(1)是否可見。onPause時Activity可見,onStop時Activity不可見,但Activity對象還在內存中。
(2)在系統內存不足的時候可能不會執行onStop方法,因此程序狀態的保存、獨占設備和動畫的關閉、以及一些數據的保存最好在onPause中進行,但要注意不能太耗時。
5.onStop方法和onDestroy方法有什么區別?
onStop階段Activity還沒有被銷毀,對象還在內存中,此時可以通過切換Activity再次回到該Activity,而onDestroy階段Acivity被銷毀
6.為什么切換Activity時各方法的執行次序是(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop而不是(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume
(1)一個Activity或多或少會占有系統資源,而在官方的建議中,onPause方法將會釋放掉很多系統資源,為切換Activity提供流暢性的保障,而不需要再等多兩個階段,這樣做切換更快。
(2)按照生命周期圖的表示,如果用戶在切換Activity的過程中再次切回原Activity,是在onPause方法后直接調用onResume方法的,這樣比onPause→onStop→onRestart→onStart→onResume要快得多。
7.與生命周期密切相關的onSaveInstanceState方法和onRestoreInstanceState方法在什么時候執行?
通過閱讀源碼會發現,當targetSdkVersion小于3時onSaveInstanceState是在onPause方法中調用的,而大于3時是在onStop方法中調用的。
而onRestoreInstanceState是在onStart之后、onResume之前調用的。