Activity的生命週期和啓動模式

Activity的生命週期和啓動模式詳解

  前言

  Activity是Android四大組件之首,使用也最爲頻繁,翻譯過來就是“活動”,也就是Android應用中一個個我們可見的頁面。

  1.1 Activity的生命週期全面解析

Activity的生命週期切換圖

(1)onCreate——Activity被創建

做一些初始化工作,例如setContentView去加載界面佈局,初始化數據等。

(2)onStart——Activity被啓動

Activity已經可見,但還不能與用戶交互。

(3)onRestart——Activity被重新啓動

一般由不可見狀態重新變成可見狀態,onRestart方法就被調用。

(4)onResume——Activity可見並且可以交互

onStart可見其實Activity還在後臺,其實還無法真實看到;onResume的時候Activity才顯示到前臺,我們才真實可見。

(5)onPause——Activity正在停止

正常情況下會緊接着調用onStop,此時可以做一些存儲數據、停止動畫等工作,注意不能太耗時。

(6)onStop——Activity即將停止

可以做一些稍微重量級的回收工作,同樣不能太耗時。

(7)onDestory——Activity即將被銷燬

這是Activity生命週期的最後一個回調,我們可以做一些回收工作和最終資源的釋放。

補充說明:

(1)針對一個特定的Activity,第一次啓動時的回調爲:onCreate -> onStart -> onReasume

(2)當用戶打開新的Activity或者切換到桌面的時候,回調爲:onPause -> onStop;有一種特殊的情況,如果新打開的Activity採用了透明主題,那麼當前的Activity就不會調用onStop

(3)當用戶再次回到原Activity時,回調爲:onResatrt -> onStart -> onReasume

(4)當用戶按Back鍵回退時,回調爲:onPause -> onStop -> onDestory

(5)當Activity被系統回收後再次打開,生命週期方法回調和(1)一樣,注意只是生命週期方法一樣,不代表所有的過程都一樣。

(6)從整個生命週期來說,onCreate 和 onDestory是配對的,分別標識着Activity的創建和銷燬,並且只會有一次調用。從Activity是否可見來說,onStart 和 onStop是配對的,隨着用戶的操作或者設備的屏幕點亮和熄滅,這兩個方法可能被多次調用;從Activity是否在前臺來說,onReasume 和 onPause是配對的,也會隨着用戶的操作或者設備的屏幕點亮和熄滅被多次調用。

注意:

1、onStart, onStop 和 onResume, onPause本質上沒有太大區別;onStart, onStop是從Activity是否可見這個角度決定是否回調的,而onResume, onPause是從Activity是否位於前臺這個角度來回調的。

2、當新啓動一個Activity的時候,舊Activity的onPause方法會被先調用,然後纔會啓動新的Activity。

11-03 12:18:41.334 22730-22730/com.glp.activitychange D/MainActivity: onCreate
11-03 12:18:41.464 22730-22730/com.glp.activitychange D/MainActivity: onStart
11-03 12:18:41.464 22730-22730/com.glp.activitychange D/MainActivity: onResume
11-03 12:18:43.944 22730-22730/com.glp.activitychange D/MainActivity: onPause
11-03 12:18:43.994 22730-22730/com.glp.activitychange D/SecondActivity: onCreate
11-03 12:18:44.014 22730-22730/com.glp.activitychange D/SecondActivity: onStart
11-03 12:18:44.014 22730-22730/com.glp.activitychange D/SecondActivity: onResume
11-03 12:18:44.464 22730-22730/com.glp.activitychange D/MainActivity: onStop

代碼示例:https://github.com/guolipeng1993/ActivityChange (Android Studio項目)

  1.2 Activity的啓動模式(LaunchMode)

(1)四種啓動模式

standard:標準模式
系統默認模式,每次啓動一個Activity都會重新創建一個新的實例,不管這個實例是否已經存在。

singleTop:棧頂複用模式
在這種模式下,如果新的Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,而是調用onNewIntent方法,通過此方法的參數讀取當前請求的信息。

singleTask:棧內複用模式
在這種模式下,只要Activity在一個棧內存在,那麼多次啓動此Activity都不會重新創建實例,而是和singTop一樣,系統調用onNewIntent方法,但singleTask默認具有clearTop的效果,如果棧內已經存在新Activity的實例,則會將該實例上面的所有Activity全部移出棧,使新Activity的實例位於棧頂位置。

singleInstance:單實例模式
在該模式下,新Activity會單獨開啓一個任務棧來存放實例對象。

(2)指定啓動模式
a: 通過 AndroidManifest.xml 指定

<activity android:name=".MainActivity"
          android:launchMode="singleTop"/>

b: 通過在Intent中設置標誌來指定

Intent intent = new Intent(this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

本人能力有限,如果此博文中有哪裏講得讓人難以理解,歡迎留言交流,若有講解錯的地方歡迎指出,大家互相學期,共同進步!

發佈了32 篇原創文章 · 獲贊 42 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章