說起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的啟動模式