重識Activity生命周期

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的啟動模式這個問題。歡迎大家指正錯誤池凄,共同學習抡驼。

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肿仑,隨后出現(xiàn)的幾起案子致盟,更是在濱河造成了極大的恐慌,老刑警劉巖尤慰,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馏锡,死亡現(xiàn)場離奇詭異,居然都是意外死亡伟端,警方通過查閱死者的電腦和手機杯道,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來责蝠,“玉大人党巾,你說我怎么就攤上這事∷剑” “怎么了齿拂?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肴敛。 經(jīng)常有香客問我署海,道長,這世上最難降的妖魔是什么医男? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任砸狞,我火速辦了婚禮,結(jié)果婚禮上镀梭,老公的妹妹穿的比我還像新娘趾代。我一直安慰自己,他們只是感情好丰辣,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布撒强。 她就那樣靜靜地躺著禽捆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飘哨。 梳的紋絲不亂的頭發(fā)上胚想,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機與錄音芽隆,去河邊找鬼浊服。 笑死,一個胖子當著我的面吹牛胚吁,可吹牛的內(nèi)容都是我干的牙躺。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼腕扶,長吁一口氣:“原來是場噩夢啊……” “哼孽拷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起半抱,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤脓恕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窿侈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炼幔,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年史简,在試婚紗的時候發(fā)現(xiàn)自己被綠了乃秀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡圆兵,死狀恐怖跺讯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衙傀,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布萨咕,位于F島的核電站统抬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏危队。R本人自食惡果不足惜聪建,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茫陆。 院中可真熱鬧金麸,春花似錦、人聲如沸簿盅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棚瘟,卻和暖如春现斋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偎蘸。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工庄蹋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迷雪。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓限书,卻偏偏與公主長得像,于是被迫代替她去往敵國和親章咧。 傳聞我的和親對象是個殘疾皇子倦西,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容