天天看點

Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

Android Activity生命周期及啟動模式詳解

Activity

生命生命周期

主要從兩個方面來總結:

Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

生命周期總覽(自己畫的圖檔,醜一些):

Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

正常情況下的生命周期:

Activity的生命周期可以成對的來記憶:

1.

onCreate

onDestory

是一對,辨別着

Activity

的建立與銷毀

2.

onStart

onStop

是一對,辨別着

Activity

的開始可見與不可見

3.

onResume

onPause

是一對,辨別着

Activity

是否有焦點,也是能否與使用者進行互動

  • Activity

    從啟動到運作經過

    onCreate-->onStart()-->onResume

    ,

    onCreate

    的時候不可見,到

    onStart

    的時候

    Activity

    已經是可見的了.
  • Activity

    失去焦點但是仍然可見的時候會調用

    onPause

    (常見的情況是彈出

    Dialog

    或者透明背景的Activity) , 打開新的

    Activity

    或者回調桌面,

    Activit

    y徹底不可見的時候回回調

    onStop

    ,打開新

    Activity

    的流程如下:
    Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解
  • 鎖屏與解鎖觸發的是

    onPause

    方法,沒有

    onStop

  • 目前Activity執行的是

    onPause-->onStop

    ,要啟動的

    Activity

    按正常的生命周期走,要注意的是隻有目前

    Activity

    回調

    onPause

    結束之後才能啟動另一個

    Activity

    ,是以應該盡量避免在

    onPause

    内處理耗時任務
  • 如果

    Activity

    從無焦點可見到有焦點可見(常見的情景是

    Dialog

    消失),回調

    onResume

    回到運作狀态
  • Activity

    從完全不可見的狀态回到可見狀态(回到原

    Activity

    ),調用的是

    onRestart-->onStart-->onResume

    .前提是在

    onStop

    之後未被系統回收,如果目前

    Activity

    優先級較低記憶體不足時被系統回收,那麼退回

    Activity

    時會重新開始生命周期,即

    onCreate-->onStart-->onResume

  • 從整個生命周期來說,

    onCreate

    onDestory

    是相對的,标志着

    Activity

    的建立和銷毀,

    onStart

    onStop

    是相對的,标志着

    Activity

    是否可見,

    onResume

    onPause

    是相對的,标志着

    Activity

    是否有焦點,或者了解為是否在前台
  • Activity

    的啟動流程概述
    Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

    異常情況下的生命周期:

    所謂異常情況,就是除了受使用者操作所導緻的生命周期方法排程之外的其他情況,主要有兩類:

    Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

    資源檔案相關的系統配置發生改變的情況

    這個分類下最典型的情況是螢幕翻轉,至于為什麼分到資源檔案改變相關,隻要知道

    res

    目錄下有不同的圖檔和資源檔案對應不同的螢幕分辨率就可以了,類似的橫豎屏也是有不同的資源檔案對應的,隻不過大部分情況下我們是隻寫一套資源的,(例如

    Android

    自帶的側滑菜單,豎屏模式下需要滑動才能顯示,橫屏模式下直接就顯示在側邊,這就是橫豎屏資源檔案的應用之一),這類情況下的生命周期如下圖所示:

    Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

    圖上顯示的隻是一個大概的流程,表面了當遇到此類異常情況的時候

    Activity

    會回調

    onSaveInstance

    方法來儲存資料,然後

    Activity

    銷毀,但是會自動重新建立,然後恢複之前儲存的資料,然後到達運作狀态.其中有一些細節需要注意:

  • 遇到此類異常

    Activity

    被銷毀的時候,

    onPause

    ,

    onStop

    ,

    onDestory

    都會走一遍
  • onSaveInstanceState

    方法隻會在異常情況下被調用,正常的使用者操作是不會觸發這一方法的
  • onSaveInstanceState

    方法的回調時機是不确定的,但一定是在

    onStop

    之前,當然也是

    onDestory

    之前,可能在

    onPause

    之前也可能在

    onPause

    之後
  • onRestoreInstanceState

    隻會在異常情況下有資料儲存的時候才會在啟動過程中調用,而且一旦調用其中傳的

    Bundle

    對象一定是不為空的,類似的

    onCreate

    中也有

    Bundle

    對象,但是需要判空操作.
  • Activity

    異常儲存資料的時候,其承載的

    View

    也需要儲存資料,具體的流程是
    Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解
  • 當Activity發生異常需要儲存資料的時候,回調onSaveInstanceState方法,Activity會委托WIndow去儲存資料,Window接到請求時會委托其頂級容器,頂層容器一一通知子View來儲存資料,典型的委托思想.

資源檔案變化所引起的生命周期變化其實是可以避免的,當資源檔案變換的時候不想重新建立

Activity

的時候可以給

Activity

指定

configuration

屬性,具體的屬性值标示如下

項目 含義

mcc

SIM卡唯一标示IMSI中的國家代碼,三位數字組成,次标示标示mcc代碼發生改變(自己的了解是切換國家)

mnc

SIM卡唯一辨別IMSI的營運商代碼,移動為00,聯通為01,電信為03,此項辨別辨別mnc發生改變

locale

裝置的本地位址發生了改變,一般指切換了系統語言

touchscreen

觸摸屏發生了改變,正常情況下不會發生

keyboard

鍵盤類型發生了改變,比如使用外接鍵盤

keyboardHidden

鍵盤的可通路性發生了改變,比如調出了鍵盤

navigation

系統導航方式發生了改變,比如使用軌迹球

screenLayout

螢幕的布局發生了改變,比如使用了外接裝置

fontScale

系統字型的縮放比例發生了改變,比如更換了字型

uiMode

使用者界面模式發生了改變,比如說使用夜間模式

orientation

螢幕方向發生了改變,最常用的之一

screenSize

螢幕的尺寸資訊發生改變,搭配orientation一起使用禁止螢幕旋轉重走生命周期

smallesScreenSize

螢幕尺寸發生改變,但是隻針對實體螢幕尺寸,比如說切換到外接螢幕

layoutDirection

布局發生改變,較少使用

使用方法舉例,比如說忽略螢幕旋轉時候的生命周期改變

<activity 
     ...
     android:configChanges = "orientation|screenSize"
     ...
     ...
           

資源不足的情況下導緻低優先級

Activity

被殺死的異常情況

優先級排序:

Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

當系統記憶體不足的時候,系統就會按照上述優先級去殺死目标

Activity

所在的程序,并通過

onSaveInstanceState

onRestoreInstanceState

來儲存和恢複資料.如果一個程序沒有四大元件在執行,那麼這個程序将會很快被系統殺死.其異常的生命周期方法與資源檔案相關異常情況下的生命周期方法相同,就不啰嗦了.

Activity

的啟動模式詳解:

啟動模式概述:預設情況下,多次啟動同一個

Activity

的時候,系統會穿件多個執行個體并把他們一一放入棧中,當單機

back

鍵,這些

Activity

會一一回退出棧.多次啟動同一個

Activity

會建立多個執行個體顯得浪費記憶體,是以需要啟動模式來調整

Activity

的啟動.

一共有四種啟動模式:

Android Activity生命周期及啟動模式詳解Android Activity生命周期及啟動模式詳解

standard

: 标準模式,系統預設的模式,每次建立

Activity

都會重制建立一個新的執行個體,不管這個執行個體是否已經存在,生命周期符合典型的生命周期.這種模式下,誰啟動了這個

Activity

,這個

Activity

就會運作在啟動它的那個

Activity

所在的棧中,是以如果使用非

Activity

類型的

Context

(例如:

ApplicationContext

)去啟動

Activity

就會報錯,解決辦法就是指定

FLAG_ACTIVITY_NEW_TASK

标記位,這樣啟動的時候就會為他建立一個新的任務棧.

singleTop

: 棧頂複用模式:這種模式下,如果目前

Activity

已經位于任務棧的頂部,則不會重新建立執行個體,隻會回調其

newIntent

方法,也不會重走生命周期,如果不在棧頂,則建立執行個體.

singleTask

: 棧内服用模式:這種模式下,如果棧記憶體在

Activity

的執行個體,則将其上面的所有

Activity

出棧,直到那個

Activity

處于棧頂為止,隻會回調其

newIntent

方法,如果不存在,則建立執行個體.

singleInstance

: 單執行個體模式.相當于加強版的

singleTask

模式,除了具有

singleTask

的特性之外,還加了一點,就是使用此模式的

Activity

隻能單獨的處于一個任務棧中

四種啟動模式的應用場景:

standard

模式,沒有特殊需求的都預設使用的這個模式

singleTop

模式 :使用于通過通啟動的

Activity

.例如新聞推送,顯示新聞詳情的界面就應該設定為

singleTop

,因為如果每一次點選通知啟動新聞詳情都打開一個

Activity

,回退的時候會有很不好的體驗

singleTask

模式 :适用于會被其他程式調起但是不想顯示之前界面的

Activity

,例如浏覽器,不管被多少個應用通路網站功能調用,都顯示的是主界面

singleInstance

模式 :适用于與程式分開的頁面,比如鬧鐘提醒,鬧鐘的提醒界面和鬧鐘的設定界面就應該分開

主要是作者在啟動模式這方面使用的比較少,平時沒太大注意,是以能說的少一些,以後有新的内容會來補充的.

最後安利一下一個新手交流的

QQ

群,歡迎加入,群号:

375276053