最近在面試的過(guò)程中,發(fā)現(xiàn)一些小朋友對(duì)Activity生命周期事件掌握的還不是特別牢固。當(dāng)然伏伐,這里我指的不是單個(gè)Activity的生命周期事件,而是從一個(gè)Acitivty跳轉(zhuǎn)到另外一個(gè)Activity的時(shí)候晕拆,2個(gè)Activity的生命周期事件是按照什么順序發(fā)生的藐翎。
單個(gè)Activity的生命周期事件
這個(gè)大家都知道材蹬,在這里就簡(jiǎn)單列一下:
Activity啟動(dòng)的時(shí)候:onCreate() -> onStart() -> onResume()
Activity退出的時(shí)候:onPause()-> onStop()-> onDestroy()
從ActivityA跳轉(zhuǎn)到ActivityB的生命周期事件
如果兩個(gè)Activity事件攪和在一起,您能確定它們的事件順序嗎吝镣?
首先堤器,看看從ActivityA跳轉(zhuǎn)到ActivityB的事件:
通過(guò)上圖可以清晰的看到,當(dāng)從ActivityA跳轉(zhuǎn)到ActivityB的的時(shí)候末贾,首先執(zhí)行的是ActivityA的onPause()
方法闸溃,然后是ActivityB的一系列生命周期方法,最后再是ActivityA的onStop()
方法拱撵。ActivityA的onDestroy()
方法不會(huì)被調(diào)用辉川。
看看用戶從ActivityB返回ActivityA的情況:
ActivityB的onPause()
方法先被調(diào)用,然后是ActivityA的生命周期方法拴测,當(dāng)ActivityA的onResume()
執(zhí)行之后乓旗,ActivityB的onStop()
和onDestroy()
會(huì)被調(diào)用。
生命周期事件背后的設(shè)計(jì)思想
其實(shí)集索,要記住以上事件的順序不是什么難事屿愚。但是重要的是,我們需要考慮:Android為什么會(huì)這樣設(shè)計(jì)务荆?
為什么不管是跳轉(zhuǎn)還是返回妆距,都是當(dāng)前Activity的
onPause()
方法先被調(diào)用?為什么不管是跳轉(zhuǎn)還是返回蛹含,前一個(gè)Activity的
onStop()
方法總是在新的Activity的onResume()
方法后被調(diào)用毅厚?
其實(shí),這背后隱藏著一個(gè)重要的Android設(shè)計(jì)思想:在任何時(shí)候浦箱,都是UI優(yōu)先吸耿。保證用戶體驗(yàn)永遠(yuǎn)是第一位的。
以跳轉(zhuǎn)為例酷窥,當(dāng)Activity發(fā)生跳轉(zhuǎn)的時(shí)候咽安,第一個(gè)事件肯定是要交給當(dāng)前處于前臺(tái)的ActivityA,這樣可以保證UI事件可以第一時(shí)間執(zhí)行蓬推。然后妆棒,再執(zhí)行ActivityB的生命周期事件,當(dāng)ActivityB已經(jīng)出現(xiàn)在前臺(tái)之后沸伏,再調(diào)用ActivityA的onStop()
方法糕珊,因?yàn)榇藭r(shí)ActivityA已經(jīng)在后臺(tái)了,所以onStop()
不會(huì)影響到前臺(tái)的用戶體驗(yàn)毅糟。
onPause()和onStop()的區(qū)別
在日常開(kāi)發(fā)中红选,很多同學(xué)對(duì)這兩個(gè)方法都是混著用的,沒(méi)有想的特別清楚姆另。實(shí)際上喇肋,根據(jù)上面的分析坟乾,這兩個(gè)方法還是有一定區(qū)別的:
首先,onPause()
方法是跳轉(zhuǎn)前的第一個(gè)方法蝶防,所以在這個(gè)方法里面一定不能做耗時(shí)的操作甚侣,否則會(huì)影響下一個(gè)Activity的出現(xiàn),讓用戶覺(jué)得不流暢间学。
而ActivityA的onStop()
方法被調(diào)用的時(shí)候殷费,ActivityB已經(jīng)在前臺(tái)了,所以可以在onStop()
方法里做一些清理的工作菱鸥,不會(huì)影響到用戶的體驗(yàn)宗兼。
onSaveInstanceState()方法的調(diào)用時(shí)機(jī)
Android里onSaveInstanceState()
的調(diào)用時(shí)機(jī)也是讓人比較困惑的事情。首先氮采,onSaveInstanceState()
并不是Activity的生命周期方法殷绍,這意味著這個(gè)方法不是總會(huì)被調(diào)用的。只有在Activity可能會(huì)被系統(tǒng)銷毀的時(shí)候才可能被調(diào)用鹊漠。
拿上面的例子來(lái)說(shuō)主到,從ActivityA跳轉(zhuǎn)到ActivityB,ActivityA被壓在ActivityB下面躯概,這種情況可能會(huì)被系統(tǒng)銷毀登钥,所以onSaveInstanceState()
會(huì)被調(diào)用。如果在ActivityB的頁(yè)面里用戶按Home退出娶靡,onSaveInstanceState()
也是會(huì)被調(diào)用的牧牢。
相反的,如果用戶在ActivityB頁(yè)面按Back鍵返回ActivityA姿锭,此時(shí)塔鳍,ActivityB的onSaveInstanceState()
是不會(huì)被調(diào)用的。
再說(shuō)從ActivityA跳轉(zhuǎn)到ActivityB的時(shí)候呻此,還有個(gè)很奇怪的情況:
在Android P之前轮纫,ActivityA的onSaveInstanceState()
是在onStop()
之前被調(diào)用的,而且和ActivityA的onPause()
的調(diào)用誰(shuí)先誰(shuí)后不確定焚鲜!
在Android P及之后掌唾,onSaveInstanceState()
是在onStop()
之后被調(diào)用的。
下面是官方的解釋:
If called, this method will occur after
onStop()
for applications targeting platforms starting withBuild.VERSION_CODES.P
. For applications targeting earlier platform versions this method will occur beforeonStop()
and there are no guarantees about whether it will occur before or afteronPause()
.
總結(jié)
Android的生命周期方法忿磅,其實(shí)是很基礎(chǔ)的知識(shí)糯彬。但是細(xì)摳的話,還是有不少細(xì)節(jié)的葱她。
最后情连,還是拿這張大家都看過(guò)的圖來(lái)鎮(zhèn)樓: