天天看點

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

生命周期

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

1、有兩個Activity A和B,從A跳轉到B,然後在B中按傳回鍵,傳回A,兩者的生命周期變化如下:

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

2、在Activity A處于running狀态時,有電話打入:

這裡就需要注意,就存在兩種情形,如果來電提醒是以彈窗的形式出來的,如下圖:

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

此時Activity A還處于可見狀态,其生命周期如下:注意是在接聽電話後,不是在彈窗彈出時,彈窗彈出時是沒有反應的,可能跟具體的系統有關。

接聽電話後跳轉到通話界面:onPause
挂斷電話後傳回Activity A:onResume
           

但是如果像下面這種,來電提醒是以一個新的界面形式出現的,如下圖:

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

此時Activity A處于不可見狀态了,其生命周期如下:

由于來電從Activity A跳轉到了來電提醒界面:onPause -> onStop
挂斷電話或者結束通話後傳回Activity A:onRestart -> onStart -> onResume
           

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

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

4、未設定Activity A的屬性,從豎屏狀态轉為橫屏狀态時,然後再轉換為豎屏狀态:

Activity生命周期與啟動模式筆記生命周期啟動模式
android:screenOrientation="portrait" //隻豎屏
android:screenOrientation="landscape" //隻橫屏
android:configChanges="orientation|keyboardHidden"
(跟蹤framework層代碼,是由于google在android3中添加了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棧

繼續閱讀