標籤:命令 restart 3.2 快速 ons 方法 clear lag rest
- 8.1 Activity
- 8.1.1 起源
- 8.1.2 Activity形態
- 8.1.3 生命週期
- 8.2 Activity任務棧簡介
- 8.3 ActivityManifest啟動模式
- 8.3.1 standard
- 8.3.2 singleTop
- 8.3.3 singleTask
- 8.3.4 singleInstance
- 8.4 Intent Flag啟動模式
- 8.5 清空任務棧
- 8.6 Activity任務棧使用
四大組件中出現頻率最高的組件
Activity是與使用者互動的第一介面,它提供了一個使用者完成指令的視窗,系統採用Activity棧的方式來管理Activity
- Activity/Running
Activity處於Activity棧的最頂層,可見,並與使用者進行互動
- Paused
當Activity失去焦點,被一個新的非全屏的Activity或者一個透明的Activity放置在棧頂時,Activity就轉換成了Paused形態,但它只是失去了與使用者互動的能力,所有狀態資訊,成員變數都還保留著,只有在系統記憶體極地的情況下,才會被系統回收掉
- Stopped
如果一個Activity被另一個Activity完全覆蓋,那麼Activity就會進入stop形態,此時他不再可見,但卻依然保持了所有狀態資訊和成員變數
- Killed
當Activity被系統回收或者Activity從來沒有建立過,Activity就處於Killed狀態
Google經典生命週期圖:
由於Android群英傳介紹的不詳細,我採用Android開發藝術探索這本書介紹生命週期:
- onCreate:表示Activity正在被建立,這是生命週期的第一個方法,在這個方法可以做一些初始化工作,比如調用setContentView去載入介面布局資源、初始化Activity所需資料等
- onRestart:表示Activity正在重新啟動,一般情況下,噹噹前Activity從不可見重新變為可見狀態時,onRestart就會被調用,這種情形一般是使用者行為所導致的,比如使用者按Home鍵切換到案頭或者使用者開啟一個新的Activity,這是當前的Activity就會暫停,也就是onPause和onStop被執行了,接著使用者又回到了這個Activity,就會出現這種情況
- onStart:表示Activity正在被啟動,即將開始,這時Activity已經可見了,但是還沒有出現在前台,還無法和使用者互動,這個時候其實可以理解為Activity已經顯示出來了,但是我們還看不到
- onResume:表示Activity已經可見了,並且出現在前台並開始活動,要注意這個和onStart的對比,onStart和onResume都表示Activity已經可見,但是onStart的時候Activity還在後台,onResume的時候Activity才顯示在前台
- onPause:表示Activity正在停止,正常情況下,緊接著onStop就會被調用,在特殊情況下,如果這個時候快速地再回到當前Activity,那麼onResume會被調用,筆者的理解是,這種情況屬於極端情況,使用者操作很難重現這一情境,此時可以做一些儲存資料、停止動畫等工作,但是注意不能太耗時,因為這會影響到新Activity顯示,onPause必須先執行完,新Activity的onResume才會執行
- onStop:表示Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時
- onDestroy:表示Activity即將被銷毀,這是Activity生命週期最後一個回調,在這裡,我們可以做一些回收工作和最終的資源釋放
除生命週期外,還有Activity的狀態會儲存起來:
- 如果你長時間處於stopped狀態而且此時系統需要更多記憶體或者系統記憶體極為緊張時,系統會回收你的Activity,而此時系統為了補償你,會將Activity狀態通過onSaveInstanceState()方法儲存到Bundle對象中,當你需要重新建立這些Activity的時候,儲存的Bundle對象就會傳遞到Activity的onRestoreInstanceState()方法與onCreate()方法中,即可調用該方法恢複被銷毀時的狀態
當一個App啟動時,如果當前環境下不存在該App的任務棧,那麼系統就會建立一個任務棧,此後,這個App所啟動的Activity都將在這個任務棧中被管理,這個棧也被稱為一個Task,即表示若干個Activity的集合,他們組成在一起形成一個Task,特別要注意的是,一個Task中的Activity可以來自不同的App,同一個App的Activity也可能不在一個Task中
棧的結構是後進先出的線性表,通過在AndroidManifest檔案中的屬性android:launchMode來設定或者是通過Intent的flag來設定的
Manifest提供了四種啟動模式:
- standard
- singleTop
- singleTask
- singleInstance
對於這四種啟動模式可以簡單的在我另一篇部落格理解一下:四種啟動模式
- Intent.FLAG-ACTIVITY-NEW-TASK:使用一個新的Task來啟動一個Activity,但啟動的每個Aetivity都將在一個新的Task中,該Flag通常使用在從service中啟動的actiity情境,由於在Service中並不存在Activity棧,所以使用該Flag來建立一個新的Activity棧,並建立新的Activity執行個體
- FLAG-ACTIVITY-SINGLE-TOP:使用singletop模式來啟動一個Activity,與指定android:launchMode=”singleTop”效果相同
- FLAG-ACTIVITY-CLEAR-Top:使用SingleTask模式來啟動一個Activity,與指定android:launchMode=”singleTask”效果相同
- FLAG-ACTIVITY-NO-HISTORY:使用這種模式啟動Acuvity,當該Activity啟動其他AcuVity後,該Activity就消失了,不會保留在Activity棧中,例如A-B,B中以這種模式啟動C,C再啟動D,則當前Activity棧為ABD
系統同樣提供了清空任務棧的方法讓我們將一個Task全部清除,通常可以在AndroidManifest的<activity>標籤中使用下面屬性來清理:
- clearTaskOnLaunch:每次返回Activity的時候,都將該Activity上的所有Activity都清除,雅思基礎通過這個屬性,可以讓這個Task每次初始化的時候,都只有一個Activity
- finishTaskOnLaunch:這個屬性和clearTaskOnLaunch有點類似,只不過clearTaskOnLaunch作用在別人身上,而finishTaskOnLaunch作用在自己身上,通過這個屬性,當離開這個Activity所處的Task,那麼使用者再返回的時候,該Activity會被finish掉
- alwaysRetainTaskState:Task的一道免死金牌,如果將Activity這個屬性設定為true,那麼該Activity所在的Task將不接受任何清除命令,一直保持當前Task的狀態
無知識點
Android群英傳知識點回顧——第八章:Activity與Activity調用棧分析