在正常情況下,Activity會經(jīng)歷如下的生命周期。
(1) onCreate:表示Activity正在被創(chuàng)建,在這個方法中,可以做一些初始化的工作,比如調用setContentView去加載界面布局資源、初始化Activity所需的數(shù)據(jù)等。
(2)onStart:表示Activity正在被啟動,這時Activity已經(jīng)可見了,但是還沒有出現(xiàn)在前臺,還無法和用戶交互。這個時候其實可以理解為Activity已經(jīng)顯示出來了,但是我們還看不到。也就是這個方法在Activity由不可見變成可見的時候調用。
(3)onResume:表示Activity已經(jīng)可見了,并且出現(xiàn)在前臺并開始活動,可以與用戶進行交互了。要注意這個和onStart的對比,onStart和onResume都表示Activity已經(jīng)可見,但是onStart的時候Activity還在后臺,onResume的時候才顯示到前臺。
(4)onPause:表示Activity正在停止,正常情況下,緊接著onStop就會被調用。在這個時候Activity還是可見的,如果再回到當前的Activity,那么onResume會被調用。如,用戶啟動一個Dialog? Activity,沒有把原來的Activity完全蓋住,那么原來的Activity就會進入onPause狀態(tài),此時返回原來的Activity就會調用onResume。我們通常會在這個方法釋放掉一些CPU資源,以及保存一些關鍵數(shù)據(jù),但這個方法一定要快,不然會影響新的Activity的顯示,onPause必須先執(zhí)行完,新的Activity的onResume才會執(zhí)行。
(5)onStop:表示Activity即將停止,執(zhí)行完這個方法后Activity就進入完全不可見狀態(tài),可以做一些稍微重量級的回收工作,同樣不能太耗時。
(6)onDestroy:表示活動即將被銷毀,這是Activity生命周期中的最后一個回調,在這里,我們可以做一些回收工作和最終資源的釋放。
(7)onRestart:表示Activity正在重新啟動。一般情況下,當當前Activity從不可見重新變?yōu)榭梢姞顟B(tài)時,onRestart就會被調用。這種情形一般是用戶行為所導致的,比如用戶按Home鍵切換到桌面或者用戶打開了一個新的Activity,這時當前的Activity就會暫停,也就是onPause和onStop被執(zhí)行了,接著用戶又回到了這個Activity,就會出現(xiàn)這種情況。
正常情況下,Activity的常用生命周期就只有上面7個,這7個方法除了onRestart方法,其他都是兩兩相對的,從而又可以將活動分為3種生存期。
完整生存期。Activity在onCreate方法和onDestroy方法之間所經(jīng)歷的,就是完整生存期。一般情況下,一個Activity會在onCreate方法中完成各種初始化操作,而在onDestroy方法中完成釋放內存的操作。
可見生存期。Activity在onStart方法和onStop方法之間所經(jīng)歷的,就是可見生存期。在可見生存期內,Activity對于用戶總是可見的,即便有可能無法和用戶進行交互。我們可以通過這兩個方法,合理地管理那些對用戶可見的資源。比如在onStart方法中對資源進行加載,而在onStop方法中對資源進行釋放,從而保證處于停止狀態(tài)的Activity不會占用過多內存。
前臺生存期。Activity在onResume方法和onPause方法之間所經(jīng)歷的就是前臺生存期。在前臺生存期內,活動總是處于運行狀態(tài)的,此時的活動是可以和用戶進行交互的,我們平時看到和接觸最多的也就是這個狀態(tài)下的Activity。
為了能更好理解Activity各種生命周期的切換過程,Android官方提供了一張活動周期的示意圖,如圖所示:

針對上圖,這里再附加一些說明,分如下幾種情況。
(1)針對一個特定的Activity,第一次啟動,回調如下:onCreate -> onStart -> onResume。
(2)當用戶打開新的Activity或者切換到桌面的時候,回調如下:onPause -> onStop。這里有一種特殊情況,如果新Activity采用了透明主題,那么當前的Activity不會回調onStop。
(3)當用戶再次回到原Activity時,回調如下:onRestart -> onStart -> onResume。
(4)當用戶按Back鍵回退時,回調如下:onPause -> onStop -> onDestroy。
(5)當Activity被系統(tǒng)回收后再次打開,生命周期方法回調過程和(1)一樣,注意生命周期方法是一樣的,不代表所有過程一樣。
異常情況下的生命周期分析
1.? 資源相關的系統(tǒng)配置發(fā)生改變導致Activity被殺死并重新創(chuàng)建
當系統(tǒng)配置發(fā)生改變后,Activity會被銷毀,其onPause、onStop、onDestroy均會被調用,同事由于Activity是在異常情況下終止的,系統(tǒng)會調用onSaveInstanceState來保存當前Activity的狀態(tài)。需要強調一點的是,這個方法只會出現(xiàn)在Activity被異常終止的情況下,正常情況下系統(tǒng)不會回調這個方法。當Activity被重新創(chuàng)建后,系統(tǒng)會調用onRestoreInstanceState,并且把Activity銷毀時onSaveInstanceState方法所保存的Bundle對象作為參數(shù)同時傳遞給onRestoreInstanceState和onCreate方法。onRestoreInstanceState和onCreate方法,兩者的區(qū)別是:onRestoreInstanceState一旦被調用,其參數(shù)Bundle savedInstanceState一定是有值的,不用額外地判斷是否為空;但是onCreate不行,onCreate如果正常啟動的話,其參數(shù)Bundle savedInstanceState為null,所以必須要額外判斷。
2.? 資源內存不足導致低優(yōu)先級的Activity被殺死
Activity按照優(yōu)先級從高到低,可以分為如下三種:
(1)前臺Activity——正在和用戶交互的Activity,優(yōu)先級最高。
(2)可見但非前臺的Activity——比如Activity中彈出了一個對話框,導致Activity可見但是位于后臺無法和用戶直接交互。
(3)后臺Activity——已經(jīng)被暫停的Activity,比如執(zhí)行了onStop,優(yōu)先級最低
當系統(tǒng)內存不足時,系統(tǒng)就會按照上述優(yōu)先級去殺死目標Activity所在的進程,并在后續(xù)通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復數(shù)據(jù)。如果一個進程中沒有四大組件在執(zhí)行,那么這個進程將很快被系統(tǒng)殺死,因此,一些后臺工作不適合脫離四大組件而獨立運行在后臺中,這樣進程很容易被殺死。比較好的方法是將后臺工作放入Service中從而保證進程有一定的優(yōu)先級,這樣就不會輕易地被系統(tǒng)殺死。