Activity生命周期和啟動模式

一、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的生命周期和啟動模式就講到這里了,講的很基礎,第一次開始寫就先從基本的開始吧。

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

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容