Activity基本上以三種狀態(tài)存在:
- 運行中
位于屏幕前臺并且具有焦點- 已暫停
另一個activity在上方柬泽,但是主題為透明或者未覆蓋整個屏幕合冀,此時內(nèi)存極度不足的情況下舊activity可能會被回收。- 已停止
被另一個activity完全遮擋加缘,此時內(nèi)存極度不足的情況下舊activity可能會被回收。
典型的activity生命周期
onCreate:
一切的開始,初始化界面辣往、數(shù)據(jù)
onDestory:
這是生命周期的最后一步,所以要在此釋放所有資源殖卑,比如網(wǎng)絡(luò)請求的線程站削。再者就是銷毀有調(diào)用finish()和系統(tǒng)回收兩種情況,可通過isFinishing()方法區(qū)分兩種情形孵稽。
onStart:
在 Activity 即將對用戶可見之前調(diào)用许起。如果 Activity 轉(zhuǎn)入前臺,則后接 onResume()菩鲜,如果 Activity 轉(zhuǎn)入隱藏狀態(tài)园细,則后接 onStop()。這個時候界面已經(jīng)完成接校,但是還在后臺猛频。
onStop:
Activity 對用戶不再可見時調(diào)用。如果 Activity 被銷毀,或另一個 Activity(一個現(xiàn)有 Activity 或新 Activity)繼續(xù)執(zhí)行并將其覆蓋伦乔,就可能發(fā)生這種情況厉亏。如果 Activity 恢復與用戶的交互,則后接 onRestart()烈和,如果 Activity 被銷毀爱只,則后接 onDestroy()。
可做些稍微重量級回收工作招刹,但是同樣不能太耗時恬试。
onResume:
在 Activity 即將開始與用戶進行交互之前調(diào)用。 此時疯暑,Activity 處于 Activity 堆棧的頂層训柴,并具有用戶輸入焦點。onStart和onResume都表示activity可見妇拯,但是前者還在后臺幻馁,后者顯示到了前臺。
onPause:
如果 Activity 返回前臺越锈,則后接 onResume()仗嗦,如果 Activity 轉(zhuǎn)入對用戶不可見狀態(tài),則后接 onStop()甘凭。在跳轉(zhuǎn)未finish下如果可見(比如透明主題等)則不接onStop稀拐。
此方法通常用于確認對持久性數(shù)據(jù)的未保存更改(比價重要的,如用戶編輯)丹弱、停止動畫以及其他可能消耗 CPU 的內(nèi)容德撬,諸如此類。但是不能太耗時躲胳,因為新Activity只有在舊的onPasue執(zhí)行后才會執(zhí)行蜓洪。
特殊的onRestart:
在 Activity 已停止并即將再次啟動前調(diào)用。后接 onStart()坯苹。這個方法大家可以在具體情況中考慮使用蝠咆。
舉例:
1、A1啟動A2北滥,如果A2是透明主題刚操,則A1生命周期走到onPause
2、A1啟動A2再芋,A1 onPause之后是A2 onCreate菊霜,onStart,onResume济赎,然后是A1后面的生命周期
3鉴逞、在2的情況下返回back按鍵记某,則A2 onPause,A1 onRestart,onStart,onResume然后A2 onStop构捡,onDestory
異常生命周期
情況1液南、橫豎屏切換
從這個流程圖中可以看到兩個方法:onSaveInstanceState()和 onRestoreInstanceState(),前者是保存勾徽,后者是恢復(也可在onCreate中恢復滑凉,但是onCreate需要判空,onRestoreInstanceState則不需要喘帚,因為該方法被調(diào)用則肯定不為空)畅姊。首先需要明確的是onSaveInstanceState和onRestoreInstanceState是在生命周期異常才會被調(diào)用的,正常的activity執(zhí)行是不會同時調(diào)用的吹由,但是若未,比如啟動新的activity或者按下home按鍵,onSaveInstanceState會單獨執(zhí)行倾鲫,但是onRestoreInstanceState不會執(zhí)行粗合。正常的finish也是不會調(diào)用的。onSaveInstanceState調(diào)用是在onStop之前調(diào)用乌昔,具體和onPause無先后順序(一般是在onPause之后)舌劳。onRestoreInstanceState是在onStart之后調(diào)用。
再者就是Android 框架中幾乎每個小工具都會根據(jù)需要實現(xiàn)此方法玫荣,以便在重建 Activity 時自動保存和恢復對 UI 所做的任何可見更改。例如大诸,EditText 小工具保存用戶輸入的任何文本捅厂,CheckBox 小工具保存復選框的選中或未選中狀態(tài)。您只需為想要保存其狀態(tài)的每個小工具提供一個唯一的 ID(通過 android:id 屬性)资柔。如果小工具沒有 ID焙贷,則系統(tǒng)無法保存其狀態(tài)。
簡單提下View保存數(shù)據(jù)的流程:首先activity會調(diào)用onSaveInstanceState去保存數(shù)據(jù)贿堰,這時候會委托window辙芍,然后window委托上面的頂級容器,頂級容器viewGroup循環(huán)遍歷子view保存數(shù)據(jù)羹与。
情況2故硅、系統(tǒng)內(nèi)存回收
就是說如果系統(tǒng)內(nèi)存不足,會回收activity纵搁。當然吃衅,這是有優(yōu)先級的:前臺activity>可見但非前臺activity>后臺activity。
而且腾誉,如果一個進程沒有四大組件在執(zhí)行徘层,那么這個進程將很快被系統(tǒng)殺死峻呕。所以一般后臺工作可以放入Service中執(zhí)行。
羅里吧嗦
- 1趣效、系統(tǒng)也提供了onSaveInstanceState()和 onRestoreInstanceState()不執(zhí)行的方式瘦癌,就是在manifest中配置configChanges這個屬性(會調(diào)用onConfigurationChanged方法),比如配置:
android:configChanges="orientation|screenSize"
- 2跷敬、在activity的生命周期中要注意資源的回收讯私,特別是子線程、handle這些的處理干花。否則很容易導致內(nèi)存回收異常(哪怕是activity的生命周期正常的情況下)妄帘。
后面會總結(jié)下activity的啟動模式這個問題。歡迎大家指正錯誤池凄,共同學習抡驼。