1. Activity的生存期
(1)onCreate()
:
?? ?狀態(tài):Activity正在創(chuàng)建
?? ?任務(wù):第一次創(chuàng)建Activity被使用淹父,做初始化工作如setViewContent界面資源本鸣、初始化數(shù)據(jù)才顿,綁定事件活烙。
?? ?注意:此方法傳遞的Bundle属愤,為改Activity異常情況銷毀時保存的狀態(tài)信息揍诽。
(2)onStart()
:
?? ?狀態(tài):Activity正在啟動愉适,此時Activity由不可見變?yōu)榭梢?/strong>犯助,但不在前臺,不能與用戶交互维咸。
(3)onResume()
:
?? ?狀態(tài):Activity獲得焦點剂买,此時Activity在可見且在前臺,位于棧頂癌蓖,處于運行狀態(tài)瞬哼。
(4)onPause()
:
?? ?狀態(tài):Activity正在停止
?? ?任務(wù):啟動或者恢復(fù)另外一個活動的時候會調(diào)動。釋放CPU資源租副,保存關(guān)鍵數(shù)據(jù)坐慰。
(5)onStop()
:
?? ?狀態(tài):Activity即將停止
?? ?注意:新Activity是對話框模式,onStop()不會執(zhí)行用僧。
(6) onDestroy()
:
?? ?狀態(tài):Activity即將銷毀
?? ?任務(wù):回收工作结胀,資源釋放
(7)onRestart()
:
?? ?狀態(tài):Activity 重新啟動,Activity由后臺切換到前臺责循,由不可見到可見糟港。
異常情況下生命周期
(1)橫豎屏切換:
?? ?Acticity 會被銷毀,在 onStop()
之前調(diào)用 onSaveInstanceState()
保存當(dāng)前Activity狀態(tài)院仿,與 onPause()
沒有先后關(guān)系秸抚。
?? ? Activity 重建會把 onSaveInstanceState()
保存的數(shù)據(jù)用 Bundle 對象作為參數(shù)傳給 onRestoreInstanceState() 和 onCreate()
方法。從時序上來說 onRestoreInstanceState() 在 onStart()
之后.
?? ? 注意:onRestoreInstanceState() 和 onCreate() 區(qū)別為其參數(shù) Bundle savedInstanceSate
歹垫,onCreate() 正常啟動 Bundle savedInstanceSate 為空剥汤。
- 1 完整生命周期:
?onCreate();方法與onDestroy();方法之間所經(jīng)歷的。 - 2 可見生命周期
?onStart();方法與onStop();方法之間所經(jīng)歷的排惨,Activity對用戶可見吭敢,可以在onStart();方法中對資源進行加載,onStop();方法中對資源進行釋放若贮。停止狀態(tài)的Activity不會過多占用內(nèi)存省有。 - 3 前臺生命周期
?onResume();與onPause()方法之間所經(jīng)歷的,Activity處于活動狀態(tài)谴麦。
2.Activity啟動模式
-
standard
標準模式:
??系統(tǒng)默認模式蠢沿,每次啟動一個Activity都會創(chuàng)建一個新的實例,不管這個實例已經(jīng)存在匾效,典型一種多實例實現(xiàn)舷蟀,誰啟動了一個Activity,那么這個Activity就在啟動他的Activity的任務(wù)棧中
注意:使用ApplicationContext 去啟動 standard模式Activity會報錯面哼。
原因:非Activity類型的Context 并沒有所謂的任務(wù)棧野宜,可以用singleTask模式啟動解決問題
2.singleTop
棧頂復(fù)用模式:
??如果新的Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會被重新創(chuàng)建魔策,同時它的 onNewIntent()
方法會被回調(diào)匈子,通過此方法能得到當(dāng)前請求的信息。
注意:Activity的 onCreate() ,onStart() 不會被調(diào)用,因為它沒有發(fā)生改變胰默。
3.singleTask
棧內(nèi)復(fù)用模式:
??這是一種單實例模式键痛,只要 Activity 在一個任務(wù)棧中已經(jīng)存在,那么多次啟動 Activity不會重新創(chuàng)建新的實例谱煤,會將棧中的Activity調(diào)入棧頂,同時調(diào)用 onNewIntent()
方法。如果棧中不存在唾那,新創(chuàng)建一個 Activity 壓入棧中。
注意:Activity 所需要的任務(wù)棧褪尝。
- 如果所需要的任務(wù)棧與實例不存在闹获,那么會先創(chuàng)建一個任務(wù)棧,再創(chuàng)建實例并將其放入棧中恼五。
- 如果所需任務(wù)棧存在實例不存在昌罩,那么直接創(chuàng)建實例放入任務(wù)棧。
- 如果所需任務(wù)棧與實例都存在灾馒,根據(jù)棧內(nèi)復(fù)用原則茎用,實例不會創(chuàng)建, 會將改實例切換到棧頂并調(diào)用
onNewIntent()
方法睬罗,同時由于singleTask
默認具有clearTop
效果轨功,會將改實例上面的所有Activity全部出棧。
4.singleInstance
單實例模式:
??與 singleTask
類似容达,這種模式下的 Activity 只能單獨地位于一個任務(wù)棧中古涧。后續(xù)請求均不會創(chuàng)建新的 Activity ,除非改任務(wù)棧銷毀花盐。
3.Activity 任務(wù)棧
- 什么是Acticity任務(wù)棧
? ?TaskAffinity
(任務(wù)相關(guān)性)羡滑,這個參數(shù)標識了一個 Activity 任務(wù)棧所需要的名字菇爪,默認情況下 Activity 所需任務(wù)棧的名字為應(yīng)用的包名,我們可以指定TaskAffinity
屬性柒昏,他主要與 singleTask 啟動模式與 allowTaskReparenting 屬性配對使用凳宙,另外任務(wù)棧分為前臺棧和后臺棧, 后臺棧中的 Activity 位于暫停狀態(tài)职祷,用戶可以通過切換后臺任務(wù)棧再次調(diào)到前臺氏涩。
4.Activity 的Flags
??有的標記位能設(shè)置啟動模式,有的標記位影響 Activity 的運行狀態(tài)有梆,常用的標記位如下
-
FLAG_ACTIVITY_NEW_TASK
為 Activity 指定 singleTask 啟動模式是尖,其效果和在 XML中指定 該啟動模式相同。 -
FLAG_ACTIVITY_SINGLE_TOP
為 Activity 指定 singleTop 啟動模式泥耀,其效果和在 XML中指定 該啟動模式相同饺汹。 -
FLAG_ACTIVITY_CLEAR_TOP
當(dāng)它啟動時,同一任務(wù)棧所有位于它上面的 Activity 都要出棧爆袍。如果這個實例已經(jīng)存在首繁,那么系統(tǒng)會調(diào)用他的onNewIntent()
。singleTask 啟動模式默認具有此標記效果陨囊。 -
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
標記的 Activity 不會出現(xiàn)在歷史 Activity 的列表中弦疮。等同于 XML 中指定 Activity 的屬性 android:excludeFromRecents="true"。