談?wù)凙ctivity生命周期和啟動模式(一)

說起Activity大家都不陌生,它主要是跟用戶去打交道,其實,它并不僅僅將視圖顯示給用戶,它的背后隱藏的很大的知識點,今天就來講講它的一些背后隱藏的故事


生命周期分析

Activity的生命周期主要是7個,onCreate,onRestart,onStart,onResume,onPause,onStop,onDestroy
1,onCreate:當(dāng)Activity被創(chuàng)建時首先調(diào)用的方法,onContentView會去加載視圖并且顯示出來,我們也可以在這個方法里實例化一些對象

2,onRestart:當(dāng)Activity的視圖繪制完成后,從不可見到重新可見時該方法會被調(diào)用,例如,如果當(dāng)前的Activity被創(chuàng)建了,用戶按了home鍵返回了頁面或者說被其他的Activity覆蓋了,然后再返回該Activity時,該方法也會被調(diào)用,如果是正常啟動,該方法不會被調(diào)用

3,onStart:當(dāng)Activity已經(jīng)創(chuàng)建完成會調(diào)用該方法,注意的是,這里僅僅是創(chuàng)建完成,并不代表顯示給用戶了,也就是說,Activity已經(jīng)創(chuàng)建完成了,但是我們還沒有看得見

4,onResume:Activity創(chuàng)建完成并且顯示給用戶了,這里跟onStart的差別是,雖然兩者都已經(jīng)創(chuàng)建完,但是onStart還沒有顯示出來,而onResume則顯示出來了,可以跟用戶交互了

5,onPause:當(dāng)Activity不可見時,該方法會被調(diào)用,表示Activity即將不可見,相當(dāng)于準(zhǔn)備工作

6,onStop:當(dāng)onPause執(zhí)行完之后,該方法被調(diào)用,真正的不可見,但注意的是,不可見不代表Activity銷毀了,例如我們跳轉(zhuǎn)到另外一個Activity的話,那當(dāng)前的Activity執(zhí)行了onStop,但是并沒有被銷毀,還會存儲在棧中

7,onDestroy:當(dāng)Activity真正被銷毀后會回調(diào)該方法,什么是銷毀,例如用戶退出了當(dāng)前的應(yīng)用,或者當(dāng)前Activity調(diào)用了finish()方法,都會銷毀當(dāng)前Activity

來張生命周期的圖,生命周期圖網(wǎng)上太多了,就不注明出處了


總的一點概述,Activity生命周期的變化是:
1,第一次創(chuàng)建時:onCreate ——> onStart ——> onResume

2,當(dāng)Activity從可見到不可見時:onPause ——> onStop,如果ActivityB使用的是透明背景,那么當(dāng)前Activity的onStop方法不會被執(zhí)行

3,當(dāng)Activity從不可見到可見時:onRestart ——> onStart ——> onResume

4,當(dāng)Activity被銷毀后:onPause ———> onStop ——> onDestroy

5,如果多個Activity交互:
ActivityA:onCreate ——> onStart ——> onResume——> onPause
ActivityB:onCreate ——> onStart ——> onResume
ActivityA:onStop

6,如果ActivityB點擊了Back鍵后:
ActivityB:onPause
ActivityA:onRestart ——> onStart ——> onResume
ActivityB:onStop ——> onDestroy

注意的是:
1,onCreate和onDestroy只會被調(diào)用一次

2,只有當(dāng)onResume調(diào)用完之后,才會顯示出界面,onStop調(diào)用完之后,才會消失界面,onStart和onPause相當(dāng)于顯示界面前和消失界面前的準(zhǔn)備工作

3,onRestart只有在重新可見時才會被調(diào)用,正常啟動是不會被調(diào)用

4,不要在onStart和onPause方法中進行耗時操作,因為只有在這兩個方法執(zhí)行完之后,才會調(diào)用onResume和onStop方法,耗時操作會延遲顯示和消失的時間,并且對于性能來說也不好,如果需要進行耗時操作,盡量在onResume和onStop中操作

5,如果第二個Activity是出于透明狀態(tài)時,當(dāng)前的Activity不會調(diào)用onStop方法

6,如果多個Activity交互,首先當(dāng)前Activity會調(diào)用onPause,需等第二個Activity創(chuàng)建完并且顯示出來之后,第一個Activity才會執(zhí)行onStop或者銷毀

現(xiàn)在提出2個問題:
1,當(dāng)多個Activity交互時,為什么當(dāng)前的Activity需要先執(zhí)行onPause方法?
2,為什么要先執(zhí)行第二個Activity的onCreate,onStart,onResume方法,再執(zhí)行第一個Activity的onStop方法呢

Google的開發(fā)人員這樣的設(shè)計是有道理的,我們就Activity的生命周期分析下,來看下原因:
問題1:
假設(shè)當(dāng)前是一款視頻APP,用戶正在看著視頻(ActivityA),這時候有電話打進來了,系統(tǒng)會調(diào)用電話的ActivityB,這時,如果不執(zhí)行onPause方法,那么ActivityA的聲音一直存在,而ActivityB的聲音也在,這就很尷尬了

問題2:
我們知道Activity需要執(zhí)行了onStop方法才會消失頁面,當(dāng)啟動ActivityB時,ActivityA執(zhí)行了onStop方法,那么ActivityA頁面就消失了,而這時ActivityB還沒有顯示,這也很尷尬,所以說,ActiivtyA先出于一種暫停狀態(tài),預(yù)防ActivityB出現(xiàn)的各種情況,當(dāng)ActivityB完成了之后,Activity才會真正的消失


異常時期的生命周期分析

當(dāng)我們Activity發(fā)生異常時,我們可想到,Activity被創(chuàng)建了,然后發(fā)生了異常,然后消失不可見,最后銷毀,所以我們不難想到Activity發(fā)生了異常,則它的生命周期:
1,創(chuàng)建的時候發(fā)生:onCreate ——>onPause ———> onStop ——> onDestroy

2,onStart時發(fā)生:onCreate ——>onStart ——>onPause ———> onStop ——> onDestroy

3,onResume時發(fā)生:onCreate ——>onStart ——>onResume——>onPause ———> onStop ——> onDestroy

不難發(fā)現(xiàn),異常發(fā)生時都會調(diào)用onPause ———> onStop ——> onDestroy,也就是完整的銷毀流程

如果異常發(fā)生了,系統(tǒng)會調(diào)用onSaveInstanceState方法來保存當(dāng)前的狀態(tài)信息,這個方法會再onStop之前調(diào)用,跟onPause沒有關(guān)系,可能在onPause之前,也可能之后,但是注意的是,這個方法只會在發(fā)生異常時被調(diào)用,正常情況下不會被調(diào)用,onSaveInstanceState是以Bundle對象來保存數(shù)據(jù),保存了數(shù)據(jù)之后,會傳遞給onCreate,我們知道,onCreate方法中有個Bundle類型參數(shù)是savedInstanceState,這也就是說,異常出現(xiàn)了,我們可以通過savedInstanceState判斷Activity是否被重建了,如果重建了,則可以在onCreate中獲取到保存的數(shù)據(jù)


橫豎屏切換的生命周期

很多時候我們的應(yīng)用都是豎屏操作,但也有很多時候需要切換到橫屏,那么它們的生命周期會是怎樣的變化呢?

首先我們知道了第一次創(chuàng)建時候Activity的生命周期,我們不妨想象下橫豎屏有什么不一樣的地方,首先當(dāng)我們的Activity創(chuàng)建完成之后,界面已經(jīng)顯示出來了,也就是說明,view也就是確定了,然而切換橫屏的時候,我們知道view的顯示和豎屏的時候不一樣,我們回想下,view的加載是在onCreate的setContentView方法中引入的,而onCreate方法只能被調(diào)用一次,所以我們不難推斷出,橫豎屏切換之后,view重新被創(chuàng)建了,也就是說onCreate會被執(zhí)行,就是說切換之后新的Activity會被重新創(chuàng)建一次,那么舊的Activity呢?如果說舊的Activity沒有隱藏,那么我們就會看到兩個Activity交叉顯示,然而我們并沒有,而Activity是執(zhí)行了onStop方法才會隱藏,所以我們知道了舊的Activity會執(zhí)行onStop方法,那么會不會銷毀呢?如果說沒有被銷毀,那么無限的橫豎屏切換,就會導(dǎo)致Activity越來越多,特別是Activity中執(zhí)行了耗時的操作時,后果可想而知,所以,我們就得出一個結(jié)論,當(dāng)橫豎屏切換的時候,舊的Activity會執(zhí)行一次完整的生命周期,而新的Activity會被重新創(chuàng)建
橫豎屏切換時的生命周期:
1,ActivityA:
onCreate ——> onStart ——> onResume ——> onPause ——> onStop ——> onDestroy

2,ActivityB:
onCreate ——> onStart ——> onResume

如果我們需要在切換時保存信息狀態(tài),方法跟異常出現(xiàn)時一樣,在onSaveInstanceState中保存信息,然后再onCreate中取出
好了,這篇文章就先寫到這里,下篇講講Activity的啟動模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,627評論 2 380

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

  • 這是我第三遍看《Android開發(fā)藝術(shù)探索》這本書了,從第一遍看的云里霧里,第二遍略微明白之后,我決定看第三遍,并...
    陳添閱讀 874評論 2 8
  • 啟動與銷毀Activity 不同于使用 main() 方法啟動應(yīng)用的其他編程范例,Android 系統(tǒng)會通過調(diào)用對...
    安卓Boy閱讀 1,787評論 3 5
  • 轉(zhuǎn)載請注明出處:http://www.lxweimin.com/p/1449e3ec2720 生命周期是個老生常談的...
    landptf閱讀 789評論 1 3
  • 本文內(nèi)容基于《Android開發(fā)藝術(shù)探索》,有興趣的同學(xué)可以買本書,值得一看。 1.生命周期的各個過程 onCre...
    晴明_閱讀 1,839評論 1 25
  • 不因為外在的干擾,內(nèi)在的恐懼而去放棄自己想要做的事,堅持下去! 寫了這句鼓勵自己的話,是因為我目前大學(xué)一直以來遇到...
    安靜的玫瑰365閱讀 287評論 2 4