深入理解Activity的生命周期

之前學習安卓的時候只是知道生命周期是什么,有哪幾個,但具體的詳細的東西卻不知道,后來看過《Android開發(fā)藝術探索》和大量博客之后,才覺得自己真正有點理解生命周期,本文是我對生命周期的認識的總結。

廢話少說先上圖。

圖片來自于網絡

相信學習安卓的人對這幅圖都很熟悉,這是安卓Activity的生命周期活動圖,詳細而直觀得表現了Activity各生命周期間的關系。下面我來通過問答的方式來談談我對它們的認識。

1.生命周期中各個方法的含義和作用

(1)onCreate:create表示創(chuàng)建,這是Activity生命周期的第一個方法,也是我們在android開發(fā)中接觸的最多的生命周期方法。它本身的作用是進行Activity的一些初始化工作,比如使用setContentView加載布局,對一些控件和變量進行初始化等。但也有很多人將很多與初始化無關的代碼放在這,其實這是不規(guī)范的。此時Activity還在后臺,不可見。所以動畫不應該在這里初始化,因為看不到……

(2)onStart:start表示啟動,這是Activity生命周期的第二個方法。此時Activity已經可見了,但是還沒出現在前臺,我們還看不到,無法與Activity交互。其實將Activity的初始化工作放在這也沒有什么問題,放在onCreate中是由于官方推薦的以及我們開發(fā)的習慣。

(3)onResume:resume表示繼續(xù)、重新開始,這名字和它的職責也相同。此時Activity經過前兩個階段的初始化已經蓄勢待發(fā)。Activity在這個階段已經出現在前臺并且可見了。這個階段可以打開獨占設備

(4)onPause:pause表示暫停,當Activity要跳到另一個Activity或應用正常退出時都會執(zhí)行這個方法。此時Activity在前臺并可見,我們可以進行一些輕量級的存儲數據和去初始化的工作,不能太耗時,因為在跳轉Activity時只有當一個Activity執(zhí)行完了onPause方法后另一個Activity才會啟動,而且android中指定如果onPause在500ms即0.5秒內沒有執(zhí)行完畢的話就會強制關閉Activity。從生命周期圖中發(fā)現可以在這快速重啟,但這種情況其實很罕見,比如用戶切到下一個Activity的途中按back鍵快速得切回來。

(5)onStop:stop表示停止,此時Activity已經不可見了,但是Activity對象還在內存中,沒有被銷毀。這個階段的主要工作也是做一些資源的回收工作。

(6)onDestroy:destroy表示毀滅,這個階段Activity被銷毀,不可見,我們可以將還沒釋放的資源釋放,以及進行一些回收工作。

(7)onRestart:restart表示重新開始,Activity在這時可見,當用戶按Home鍵切換到桌面后又切回來或者從后一個Activity切回前一個Activity就會觸發(fā)這個方法。這里一般不做什么操作。

圖片來自網絡

通過上面的了解我們發(fā)現其實Activity中的方法大都是兩兩對應的,只有onRestart方法散發(fā)著單身狗的清香。
那么相鄰的方法之間有什么區(qū)別呢?

2.onCreate和onStart之間有什么區(qū)別?

(1)可見與不可見的區(qū)別。前者不可見,后者可見。
(2)執(zhí)行次數的區(qū)別。onCreate方法只在Activity創(chuàng)建時執(zhí)行一次,而onStart方法在Activity的切換以及按Home鍵返回桌面再切回應用的過程中被多次調用。因此Bundle數據的恢復在onStart中進行比onCreate中執(zhí)行更合適。
(3)onCreate能做的事onStart其實都能做,但是onstart能做的事onCreate卻未必適合做。如前文所說的,setContentView和資源初始化在兩者都能做,然而想動畫的初始化在onStart中做比較好。

3.onStart方法和onResume方法有什么區(qū)別?

(1)是否在前臺。onStart方法中Activity可見但不在前臺,不可交互,而在onResume中在前臺。
(2)職責不同,onStart方法中主要還是進行初始化工作,而onResume方法,根據官方的建議,可以做開啟動畫和獨占設備的操作。

4.onPause方法和onStop方法有什么區(qū)別?

(1)是否可見。onPause時Activity可見,onStop時Activity不可見,但Activity對象還在內存中。
(2)在系統(tǒng)內存不足的時候可能不會執(zhí)行onStop方法,因此程序狀態(tài)的保存、獨占設備和動畫的關閉、以及一些數據的保存最好在onPause中進行,但要注意不能太耗時。

5.onStop方法和onDestroy方法有什么區(qū)別?

onStop階段Activity還沒有被銷毀,對象還在內存中,此時可以通過切換Activity再次回到該Activity,而onDestroy階段Acivity被銷毀

6.為什么切換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方法后直接調用onResume方法的,這樣比onPause→onStop→onRestart→onStart→onResume要快得多。

7.與生命周期密切相關的onSaveInstanceState方法和onRestoreInstanceState方法在什么時候執(zhí)行?

通過閱讀源碼會發(fā)現,當targetSdkVersion小于3時onSaveInstanceState是在onPause方法中調用的,而大于3時是在onStop方法中調用的。
而onRestoreInstanceState是在onStart之后、onResume之前調用的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容