Android Activity生命周期及啟動模式詳解
Activity
生命生命周期
Activity
主要從兩個方面來總結:
生命周期總覽(自己畫的圖檔,醜一些):
正常情況下的生命周期:
Activity的生命周期可以成對的來記憶:
1. onCreate
和 onDestory
是一對,辨別着 Activity
的建立與銷毀
onCreate
onDestory
Activity
2. onStart
和 onStop
是一對,辨別着 Activity
的開始可見與不可見
onStart
onStop
Activity
3. onResume
和 onPause
是一對,辨別着 Activity
是否有焦點,也是能否與使用者進行互動
onResume
onPause
Activity
-
從啟動到運作經過Activity
,onCreate-->onStart()-->onResume
的時候不可見,到onCreate
的時候onStart
已經是可見的了.Activity
- 當
失去焦點但是仍然可見的時候會調用Activity
(常見的情況是彈出onPause
或者透明背景的Activity) , 打開新的Dialog
或者回調桌面,Activity
y徹底不可見的時候回回調Activit
,打開新onStop
的流程如下: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
異常情況下的生命周期:
所謂異常情況,就是除了受使用者操作所導緻的生命周期方法排程之外的其他情況,主要有兩類:
資源檔案相關的系統配置發生改變的情況
這個分類下最典型的情況是螢幕翻轉,至于為什麼分到資源檔案改變相關,隻要知道
目錄下有不同的圖檔和資源檔案對應不同的螢幕分辨率就可以了,類似的橫豎屏也是有不同的資源檔案對應的,隻不過大部分情況下我們是隻寫一套資源的,(例如res
自帶的側滑菜單,豎屏模式下需要滑動才能顯示,橫屏模式下直接就顯示在側邊,這就是橫豎屏資源檔案的應用之一),這類情況下的生命周期如下圖所示:Android
圖上顯示的隻是一個大概的流程,表面了當遇到此類異常情況的時候
會回調Activity
方法來儲存資料,然後onSaveInstance
銷毀,但是會自動重新建立,然後恢複之前儲存的資料,然後到達運作狀态.其中有一些細節需要注意:Activity
- 遇到此類異常
被銷毀的時候,Activity
,onPause
,onStop
都會走一遍onDestory
-
方法隻會在異常情況下被調用,正常的使用者操作是不會觸發這一方法的onSaveInstanceState
-
方法的回調時機是不确定的,但一定是在onSaveInstanceState
之前,當然也是onStop
之前,可能在onDestory
之前也可能在onPause
之後onPause
-
隻會在異常情況下有資料儲存的時候才會在啟動過程中調用,而且一旦調用其中傳的onRestoreInstanceState
對象一定是不為空的,類似的Bundle
中也有onCreate
對象,但是需要判空操作.Bundle
- 當
異常儲存資料的時候,其承載的Activity
也需要儲存資料,具體的流程是View
- 當Activity發生異常需要儲存資料的時候,回調onSaveInstanceState方法,Activity會委托WIndow去儲存資料,Window接到請求時會委托其頂級容器,頂層容器一一通知子View來儲存資料,典型的委托思想.
資源檔案變化所引起的生命周期變化其實是可以避免的,當資源檔案變換的時候不想重新建立 Activity
的時候可以給 Activity
指定 configuration
屬性,具體的屬性值标示如下
Activity
Activity
configuration
項目 | 含義 |
---|---|
| SIM卡唯一标示IMSI中的國家代碼,三位數字組成,次标示标示mcc代碼發生改變(自己的了解是切換國家) |
| SIM卡唯一辨別IMSI的營運商代碼,移動為00,聯通為01,電信為03,此項辨別辨別mnc發生改變 |
| 裝置的本地位址發生了改變,一般指切換了系統語言 |
| 觸摸屏發生了改變,正常情況下不會發生 |
| 鍵盤類型發生了改變,比如使用外接鍵盤 |
| 鍵盤的可通路性發生了改變,比如調出了鍵盤 |
| 系統導航方式發生了改變,比如使用軌迹球 |
| 螢幕的布局發生了改變,比如使用了外接裝置 |
| 系統字型的縮放比例發生了改變,比如更換了字型 |
| 使用者界面模式發生了改變,比如說使用夜間模式 |
| 螢幕方向發生了改變,最常用的之一 |
| 螢幕的尺寸資訊發生改變,搭配orientation一起使用禁止螢幕旋轉重走生命周期 |
| 螢幕尺寸發生改變,但是隻針對實體螢幕尺寸,比如說切換到外接螢幕 |
| 布局發生改變,較少使用 |
使用方法舉例,比如說忽略螢幕旋轉時候的生命周期改變
<activity
...
android:configChanges = "orientation|screenSize"
...
...
資源不足的情況下導緻低優先級 Activity
被殺死的異常情況
Activity
優先級排序:
當系統記憶體不足的時候,系統就會按照上述優先級去殺死目标 Activity
所在的程序,并通過 onSaveInstanceState
和 onRestoreInstanceState
來儲存和恢複資料.如果一個程序沒有四大元件在執行,那麼這個程序将會很快被系統殺死.其異常的生命周期方法與資源檔案相關異常情況下的生命周期方法相同,就不啰嗦了.
Activity
onSaveInstanceState
onRestoreInstanceState
Activity
的啟動模式詳解:
Activity
啟動模式概述:預設情況下,多次啟動同一個 Activity
的時候,系統會穿件多個執行個體并把他們一一放入棧中,當單機 back
鍵,這些 Activity
會一一回退出棧.多次啟動同一個 Activity
會建立多個執行個體顯得浪費記憶體,是以需要啟動模式來調整 Activity
的啟動.
Activity
back
Activity
Activity
Activity
一共有四種啟動模式:
standard
: 标準模式,系統預設的模式,每次建立 Activity
都會重制建立一個新的執行個體,不管這個執行個體是否已經存在,生命周期符合典型的生命周期.這種模式下,誰啟動了這個 Activity
,這個 Activity
就會運作在啟動它的那個 Activity
所在的棧中,是以如果使用非 Activity
類型的 Context
(例如: ApplicationContext
)去啟動 Activity
就會報錯,解決辦法就是指定 FLAG_ACTIVITY_NEW_TASK
标記位,這樣啟動的時候就會為他建立一個新的任務棧.
standard
Activity
Activity
Activity
Activity
Activity
Context
ApplicationContext
Activity
FLAG_ACTIVITY_NEW_TASK
singleTop
: 棧頂複用模式:這種模式下,如果目前 Activity
已經位于任務棧的頂部,則不會重新建立執行個體,隻會回調其 newIntent
方法,也不會重走生命周期,如果不在棧頂,則建立執行個體.
singleTop
Activity
newIntent
singleTask
: 棧内服用模式:這種模式下,如果棧記憶體在 Activity
的執行個體,則将其上面的所有 Activity
出棧,直到那個 Activity
處于棧頂為止,隻會回調其 newIntent
方法,如果不存在,則建立執行個體.
singleTask
Activity
Activity
Activity
newIntent
singleInstance
: 單執行個體模式.相當于加強版的 singleTask
模式,除了具有 singleTask
的特性之外,還加了一點,就是使用此模式的 Activity
隻能單獨的處于一個任務棧中
singleInstance
singleTask
singleTask
Activity
四種啟動模式的應用場景:
standard
模式,沒有特殊需求的都預設使用的這個模式
standard
singleTop
模式 :使用于通過通啟動的 Activity
.例如新聞推送,顯示新聞詳情的界面就應該設定為 singleTop
,因為如果每一次點選通知啟動新聞詳情都打開一個 Activity
,回退的時候會有很不好的體驗
singleTop
Activity
singleTop
Activity
singleTask
模式 :适用于會被其他程式調起但是不想顯示之前界面的 Activity
,例如浏覽器,不管被多少個應用通路網站功能調用,都顯示的是主界面
singleTask
Activity
singleInstance
模式 :适用于與程式分開的頁面,比如鬧鐘提醒,鬧鐘的提醒界面和鬧鐘的設定界面就應該分開
singleInstance
主要是作者在啟動模式這方面使用的比較少,平時沒太大注意,是以能說的少一些,以後有新的内容會來補充的.
最後安利一下一個新手交流的 QQ
群,歡迎加入,群号: 375276053
375276053