一、activity生命周期分析
1.1正常情況下的生命周期
(1)onCreate:表示Activity正在被創(chuàng)建,通常情況下我們會在這個方法里面做一些初始化資源的操作,比如setContentView加載布局以初始化一些數(shù)據(jù)的操作等。
(2)onRestart:表示Activity正在重新啟動,通常情況下,是當前activity從不可見到可見的時候,會調(diào)用onrestart,一般情況下這三種情況下會調(diào)用onrestart
? ?1)按下home鍵之后,然后切換回來,會調(diào)用onRestart()。
? ?2)從本Activity跳轉(zhuǎn)到另一個Activity之后,按back鍵返回原來Activity,會調(diào)用onRestart();
? ?3)從本Activity切換到其他的應用,然后再從其他應用切換回來,會調(diào)用onRestart();
(3)onStart:表示Activity正在被啟動,這個時候的Activity已經(jīng)可見了,只不過還沒有出現(xiàn)在前臺,無法和用戶進行交互。所以你可以理解成,activity已經(jīng)顯示了但是我們還看不到。
(4)onResume:表示Activity已經(jīng)可見了,并且已經(jīng)出現(xiàn)在前臺,并可以進行交互了,大家要注意的一點是,onStart和onResume都表示Activity可見,但是onStart的時候還在后臺,onResume的時候才顯示在前臺。
(5)onPause:表示Activity正在被停止,正常情況下會緊接著調(diào)用onStop方法,但是特殊情況下,你快速返回當前Activity的話就會調(diào)用onResume。在這個方法可以做一些不要太耗時的操作,最好在這個方法做一些數(shù)據(jù)存儲,還有動畫停止的操作,如果太耗時會影響到Activity的顯示,因為這個方法執(zhí)行完以后才會去調(diào)用新Activity的onResume方法。
(6)onStop:表示Activity即將停止,同樣的也不要太耗時,適合做一些輕量級的回收工作。
(7)onDestroy:表示Activity即將被摧毀,這是最后一個生命周期的回調(diào),我們可以做一些回收工作和最終的資源釋放。
在正常的情況下,生命周期就這上面七個,為了讓大家更好的理解,特此摳圖一張,供大家理解

這里對上面圖片補充幾點:
(1)針對一些特定的Activity,第一次啟動,回調(diào)如下:onCreate-onStart-onResume。
(2)當用戶打開了新的Activity或者按Home返回了桌面的話,回調(diào)如下:onPause-onStop,這里有一種特殊的情況,如果新的那個Activity采用了透明主題的話,那這個Activity不會返回onStop方法。
(3)當用戶返回當前Activity時,回調(diào)如下:onRestart-onStart-onResume。
(4)用用戶按back鍵的時候,回調(diào)如下:onPause-onStop-onDestory。
1.2 上面說了下正常下得生命周期,下面講講異常情況下
(1)資源相關的系統(tǒng)配置發(fā)生改變導致Activity被殺死并且重建
舉個栗子,橫屏和豎屏就會拿到兩張不同的圖片,在豎屏的情況下,突然切換到橫屏,因為系統(tǒng)配置發(fā)生了改變,在默認的情況下,Activity就會銷毀并重建(這里說的是默認情況),其生命周期如下

當系統(tǒng)配置發(fā)生改變后,Activity會被銷毀,回調(diào)如下:onPause-onStop-onDestory,
由于Activity是在異常情況下被終止的,所以系統(tǒng)會調(diào)用onSaveInstanceState方法來保存當前Activity的狀態(tài),這個方法會在onStop之前調(diào)用,不過和onPause方法沒有既定的順序,有可能在onPause之前也有可能在onPause之后。強調(diào)一點,這個方法只會在異常情況下才會調(diào)用,正常情況下不會調(diào)用這個方法。當Activity被重新創(chuàng)建后,系統(tǒng)會調(diào)用OnRestoreInstanceState方法,并把onSaveInstanceState保存的Bundle對象傳遞到OnRestoreInstanceState方法中。同時要知道的時,在onSaveInstanceState和OnRestoreInstanceState方法中,系統(tǒng)為我們做了一定的恢復工作,比如說,當前Activity的視圖結(jié)構,輸入框的數(shù)值,Listview的滾動位置等等,這些View相關的狀態(tài)系統(tǒng)都能為我們恢復。
(2)資源內(nèi)存不足,導致低優(yōu)先級Activity被殺死
這種情況不好模擬,但是數(shù)據(jù)儲存和恢復和(1)是一致的,我在這里講一下優(yōu)先級,Activity會按照優(yōu)先級情況,分為3種:
1)前臺Activity——正在和用戶交互的Activity優(yōu)先級別最高。
2)可見但非前臺Activity——如當前Activity彈出了一個Dialog框,這個Activity就處于可見但不可交互。
3)后臺Activity——被暫停的Activity,比如執(zhí)行了onStop,優(yōu)先級最低。
資源不足的時候,系統(tǒng)會按上述優(yōu)先級去殺死優(yōu)先級最低的Activity所在的進程。并在后續(xù)通過onSaveInstanceState和OnRestoreInstanceState來存儲和恢復數(shù)據(jù)。
二、Activity的四種啟動模式
Activity有四種啟動模式,分別是:standrad、singleTop、singleTask、singleInstance我們下面來詳細介紹
(1)standrad:標準模式,這是系統(tǒng)默認的模式。這個模式呢,每啟動一個Activity就會創(chuàng)建一個新的實例,不管這個實例是否存在。這是典型的多實例實現(xiàn),一個任務棧中可以有多個實例,每個實例也可以屬于不同的棧。舉個栗子:Activity A啟動Activity B(B是標準模式),那么B就會進入到A的棧里面。
(2)singleTop:棧頂復用模式,這個模式呢,只要Activity位于任務棧的棧頂就不會被重新創(chuàng)建。相反如果不在棧頂就會被重新創(chuàng)建。舉個栗子:在一個棧里面有四個實例 A B C D A在棧底,D在棧頂,D的啟動模式為singleTop,那么假設啟動D那么棧內(nèi)的情況不變,如果D的啟動模式為standrad的話,那么D就會被重建棧內(nèi)就會變成ABCDD了。
(3)singleTask:棧內(nèi)復用模式。這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那么多次啟動該Activity都不會重新創(chuàng)建一個實例。具體一點就是,當一個singleTask模式的Activity啟動后,系統(tǒng)首先會查找是否存在該Activity想要的棧,如果不存在,就重新創(chuàng)建一個棧在創(chuàng)建一個Activity實例把Activity放進去,如果存在那么就把該Activity調(diào)到棧頂,如果實例不存在就會創(chuàng)建該Activity的實例并放入棧中。
(4)singleInstance:單實例模式。這是singleTask的加強版,他除了具有singleTask所有的特性外,還加強了一點,那就是具有此模式的實例,只能單獨存在于一個棧中,換句話說就是A啟動后會為A單獨創(chuàng)建一個棧,A獨立存在于這個棧中,由于棧的復用,后續(xù)的啟動都不會重新創(chuàng)建實例。
好啦,啟動模式就講完了,那么我說一下啟動模式指定呢
有兩種方式,一種是在AndroidMenifest為Activity指定啟動模式,如圖:

另一種是通過Intent在設置標志位來為Activity設置啟動模式,如圖:

這兩種方式都可以為Activity設置啟動模式,不過兩者還是有區(qū)別的,通過優(yōu)先級來講,第二種優(yōu)先級比第一種高,兩種都存在,以第二種為準。
其次兩者在范圍也有不同,第一種不能設置FLAG_ACTIVITY_CLEAR_TOP標識,第二種無法為Activity指定singleInstance模式。
好啦Activity的生命周期和啟動模式就講到這里了,講的很基礎,第一次開始寫就先從基本的開始吧。