Activity生命週期與啟動模式筆記

一個暱稱而已T發表於2017-09-17

生命週期

這裡寫圖片描述


1、有兩個Activity A和B,從A跳轉到B,然後在B中按返回鍵,返回A,兩者的生命週期變化如下:
這裡寫圖片描述


2、在Activity A處於running狀態時,有電話打入:
這裡就需要注意,就存在兩種情形,如果來電提醒是以彈窗的形式出來的,如下圖:
這裡寫圖片描述
此時Activity A還處於可見狀態,其生命週期如下:注意是在接聽電話後,不是在彈窗彈出時,彈窗彈出時是沒有反應的,可能跟具體的系統有關。

接聽電話後跳轉到通話介面:onPause
結束通話電話後返回Activity A:onResume

但是如果像下面這種,來電提醒是以一個新的介面形式出現的,如下圖:
這裡寫圖片描述
此時Activity A處於不可見狀態了,其生命週期如下:

由於來電從Activity A跳轉到了來電提醒介面:onPause -> onStop
結束通話電話或者結束通話後返回Activity A:onRestart -> onStart -> onResume

3、在Activity A處於running狀態時點選電源按鈕熄屏再喚醒螢幕回到A,或者按下home鍵回到桌面再返回A,其生命週期都如下所示:

(1)onPause -> onStop
(2)onRestart -> onStart -> onResume

4、未設定Activity A的屬性,從豎屏狀態轉為橫屏狀態時,然後再轉換為豎屏狀態:
這裡寫圖片描述

android:screenOrientation="portrait" //只豎屏
android:screenOrientation="landscape" //只橫屏
android:configChanges="orientation|keyboardHidden"
(跟蹤framework層程式碼,是由於google在android3.2中新增了screensize改變的通知,在轉屏的時候,不僅是orientation發生了改變,screensize同樣也發生了改變所以要新增“screenSize”)

啟動模式

使用android:launchMode=”standard|singleInstance|singleTask|singleTop”來控制Acivity任務棧,改變Activity的啟動模式。其中,具體的模式內容請參閱徹底弄懂Activity四大啟動模式

任務棧是一種後進先出的結構。位於棧頂的Activity處於焦點狀態,當按下back按鈕的時候,棧內的Activity會一個一個的出棧,並且呼叫其onDestory()方法。如果棧內沒有Activity,那麼系統就會回收這個棧,每個APP預設只有一個棧,以APP的包名來命名.

standard : 標準模式,每次啟動Activity都會建立一個新的Activity例項,並且將其壓入任務棧棧頂,而不管這個Activity是否已經存在。Activity的啟動三回撥(onCreate()->onStart()->onResume())都會執行。

singleTop : 棧頂複用模式.這種模式下,如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新建立,所以它的啟動三回撥就不會執行,同時Activity的onNewIntent()方法會被回撥.如果Activity已經存在但是不在棧頂,那麼作用與standard模式一樣.

singleTask: 棧內複用模式.建立這樣的Activity的時候,系統會先確認它所需任務棧已經建立,否則先建立任務棧.然後放入Activity,如果棧中已經有一個Activity例項,那麼這個Activity就會被調到棧頂,onNewIntent(),並且singleTask會清理在當前Activity上面的所有Activity.(clear top)

singleInstance : 加強版的singleTask模式,這種模式的Activity只能單獨位於一個任務棧內,由於棧內複用的特性,後續請求均不會建立新的Activity,除非這個獨特的任務棧被系統銷燬了

Activity的堆疊管理以ActivityRecord為單位,所有的ActivityRecord都放在一個List裡面.可以認為一個ActivityRecord就是一個Activity棧

相關文章