探索Activity之生命周期

作為一個Android應用開發(fā)人員, 自不必說, Activity是我們應用的門面, 我們90%的工作都圍繞它進行, 用它來呈現(xiàn)內(nèi)容, 用它來與用戶交互...

那么我們真的了解Activity嗎? 它到底怎么來, 又怎么沒的呢? 它是怎么加載布局, 怎么呈現(xiàn)內(nèi)容的呢? 它們之間是如何交互的呢??? 太多的問題.

讓我們先從Activity的生命周期開始我們的探索之旅吧.

1, 疑問

  1. Activity生命周期回調(diào)有哪些? 分別對應做什么?
  2. Back和Home鍵退出Activity有什么區(qū)別?
  3. 切換屏幕會發(fā)生什么? 怎么處理?
  4. 從Activity A啟動Activity B會發(fā)生什么? 再從B啟動A呢?

2, 探索

帶著這些疑問, 開始我們的探索吧.
首先, 我們根據(jù)官方文檔中的Activity生命周期圖:

activity_lifecycle

寫一個簡單的Demo程序, 有AActiviy和BActivity兩個Activity, 分別都有兩個按鈕, 啟動A和B. 然后在二者的各個生命周期和其他對外回調(diào)中加上log信息. 做如下幾個實驗, 查看log輸出.

Demo源碼已上傳github, 源碼地址.

以下實驗中, AActivity和BActivity的啟動模式均為標準模式. 關于launch mode, 后續(xù)會結(jié)合task和back stack來一起探索.

2.1, 正常啟動Activity, Back退出, 再回來

首先, 我們看下正常啟動AActivity的log輸出:


可以看出果然如lifecycle圖所示, onCreate -- onStart -- onResume 的線路創(chuàng)建了一個新的AActivity實例 AActivity@429ea620.

Back退出:


點擊back鍵時, 依照 onPause -- onStop -- onDestroy 的順序AActivity@429ea620銷毀了.

注意: 退出時并沒有調(diào)用onSaveInstanceState.

再回來:


很明顯, 是一個新的AActivity實例AActivity@4295cd70創(chuàng)建了.

2.2, Home退出, 再回來

點擊Home鍵的log輸出:


沒有onDestory, 且調(diào)用了onSaveIInstanceState.

再回來:


因為沒有銷毀, 所以再次進入時走restart流程, onRestart -- onStart -- onResume.

2.4, 旋轉(zhuǎn)屏幕

我們旋轉(zhuǎn)以下手機屏幕看看會發(fā)生什么:


可以看到AActivity銷毀重建了~~

注意: 這里在銷毀重建的過程中, 銷毀時調(diào)用了onSaveInstanceState, 而重建時調(diào)用了onRestoreInstanceState.

我們在manifest文件中給AActivity加上configChanges屬性:

<activity
    android:name=".lifecycle.AActivity"
    android:label="A-Activity"
    android:configChanges="orientation|keyboardHidden|screenSize">
</activity>

再試下:


請忽略AActivity的hash碼. 可以看到這次AActivity在轉(zhuǎn)屏時并沒有重建, 而是調(diào)用了onConfigurationChanged.

2.5, A, B之間的切換

1, 從A發(fā)起一個Intent啟動B


1, 新啟動了一個BActivity的實例.
2, AActivity的onPause之后才開始啟動BActivity.
3, BActivity的onResume之后, AActivity才調(diào)用onStop.

2, 從B再發(fā)起一個Intent啟動A


會再新建一個AActivity的實例, 而非使用原來的實例(因為我們的launch mode是默認的標準模式).
流程和A啟動B完全一樣.

3, 從B按Back鍵到A


1, AActivity@429dadb0重啟了
2, BActivity銷毀了.
3, 和A啟動B類似, B onPause之后A 重啟, A重啟完onResume之后, B onStop -- onDestroy.

結(jié)論

  1. Activity的生命周期如官方圖所示, 從onCreate -- onStart -- onResume 創(chuàng)建, 對應onPause -- onStop -- onDestory銷毀.

  2. 這六個關鍵回調(diào)構(gòu)成三個區(qū)間:

    • 完整生命期: onCreate -- onDestory
    • 可見周期: onStart -- onStop
    • 可操作周期: onResume -- onPause
  3. Back鍵會銷毀Activity, Home鍵Activity會進入Stop狀態(tài).

  4. onSaveInstanceState和onRestoreInstanceState不是生命周期回調(diào), 不是必須調(diào)用的.

  5. 可以理解為onSaveInstanceState是系統(tǒng)認為可能會因為內(nèi)存不夠或是Configuration改變等銷毀Activity時用來存儲Activity狀態(tài)的, 故而在Back鍵銷毀時Activity并不會調(diào)用onSaveInstanceState, 因為系統(tǒng)認為這是用戶主動銷毀的.

  6. 對于轉(zhuǎn)屏的處理, 我們可以在onSaveInstanceState和onRestoreInstanceState中處理Activity重建的狀態(tài)恢復. 或是配置configChanges屬性, 在onConfigurationChanges處理Configuration變化.

  7. 從A啟動B時(或者說Activity切換時), 是A的onPause執(zhí)行完, 才會開始B的onCreate, 所以要避免在onPause回調(diào)中執(zhí)行耗時操作, 以免切換不流暢.


以上的生命周期分析, 實際上是Activity的較為簡單的表現(xiàn), 實際場景中會結(jié)合Activity的launch mode, taskAffinity, activity屬性, Intent flag等綜合考慮.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屿附,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辈挂,老刑警劉巖步鉴,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機斑匪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俘种,“玉大人秤标,你說我怎么就攤上這事绝淡≈媪酰” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵牢酵,是天一觀的道長悬包。 經(jīng)常有香客問我,道長馍乙,這世上最難降的妖魔是什么布近? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮丝格,結(jié)果婚禮上撑瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己显蝌,他們只是感情好预伺,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曼尊,像睡著了一般酬诀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骆撇,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天瞒御,我揣著相機與錄音,去河邊找鬼神郊。 笑死肴裙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涌乳。 我是一名探鬼主播蜻懦,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爷怀!你這毒婦竟也來了阻肩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烤惊,沒想到半個月后乔煞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡柒室,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年渡贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雄右。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡空骚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出擂仍,到底是詐尸還是另有隱情囤屹,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布逢渔,位于F島的核電站肋坚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肃廓。R本人自食惡果不足惜智厌,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盲赊。 院中可真熱鬧铣鹏,春花似錦、人聲如沸哀蘑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽递礼。三九已至惨险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脊髓,已是汗流浹背辫愉。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留将硝,地道東北人恭朗。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像依疼,于是被迫代替她去往敵國和親痰腮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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