
最近在面試的過程中,發(fā)現(xiàn)一些小朋友對Activity生命周期事件掌握的還不是特別牢固。當(dāng)然,這里我指的不是單個Activity的生命周期事件,而是從一個Acitivty跳轉(zhuǎn)到另外一個Activity的時候,2個Activity的生命周期事件是按照什么順序發(fā)生的。
單個Activity的生命周期事件
這個大家都知道,在這里就簡單列一下:
Activity啟動的時候:onCreate() -> onStart() -> onResume()
Activity退出的時候:onPause()-> onStop()-> onDestroy()
從ActivityA跳轉(zhuǎn)到ActivityB的生命周期事件
如果兩個Activity事件攪和在一起,您能確定它們的事件順序嗎?
首先,看看從ActivityA跳轉(zhuǎn)到ActivityB的事件:

通過上圖可以清晰的看到,當(dāng)從ActivityA跳轉(zhuǎn)到ActivityB的的時候,首先執(zhí)行的是ActivityA的onPause()方法,然后是ActivityB的一系列生命周期方法,最后再是ActivityA的onStop()方法。ActivityA的onDestroy()方法不會被調(diào)用。
看看用戶從ActivityB返回ActivityA的情況:

ActivityB的onPause()方法先被調(diào)用,然后是ActivityA的生命周期方法,當(dāng)ActivityA的onResume()執(zhí)行之后,ActivityB的onStop()和onDestroy()會被調(diào)用。
生命周期事件背后的設(shè)計思想
其實,要記住以上事件的順序不是什么難事。但是重要的是,我們需要考慮:Android為什么會這樣設(shè)計?
為什么不管是跳轉(zhuǎn)還是返回,都是當(dāng)前Activity的
onPause()方法先被調(diào)用?為什么不管是跳轉(zhuǎn)還是返回,前一個Activity的
onStop()方法總是在新的Activity的onResume()方法后被調(diào)用?
其實,這背后隱藏著一個重要的Android設(shè)計思想:在任何時候,都是UI優(yōu)先。保證用戶體驗永遠(yuǎn)是第一位的。
以跳轉(zhuǎn)為例,當(dāng)Activity發(fā)生跳轉(zhuǎn)的時候,第一個事件肯定是要交給當(dāng)前處于前臺的ActivityA,這樣可以保證UI事件可以第一時間執(zhí)行。然后,再執(zhí)行ActivityB的生命周期事件,當(dāng)ActivityB已經(jīng)出現(xiàn)在前臺之后,再調(diào)用ActivityA的onStop()方法,因為此時ActivityA已經(jīng)在后臺了,所以onStop()不會影響到前臺的用戶體驗。
onPause()和onStop()的區(qū)別
在日常開發(fā)中,很多同學(xué)對這兩個方法都是混著用的,沒有想的特別清楚。實際上,根據(jù)上面的分析,這兩個方法還是有一定區(qū)別的:
首先,onPause()方法是跳轉(zhuǎn)前的第一個方法,所以在這個方法里面一定不能做耗時的操作,否則會影響下一個Activity的出現(xiàn),讓用戶覺得不流暢。
而ActivityA的onStop()方法被調(diào)用的時候,ActivityB已經(jīng)在前臺了,所以可以在onStop()方法里做一些清理的工作,不會影響到用戶的體驗。
onSaveInstanceState()方法的調(diào)用時機(jī)
Android里onSaveInstanceState()的調(diào)用時機(jī)也是讓人比較困惑的事情。首先,onSaveInstanceState()并不是Activity的生命周期方法,這意味著這個方法不是總會被調(diào)用的。只有在Activity可能會被系統(tǒng)銷毀的時候才可能被調(diào)用。
拿上面的例子來說,從ActivityA跳轉(zhuǎn)到ActivityB,ActivityA被壓在ActivityB下面,這種情況可能會被系統(tǒng)銷毀,所以onSaveInstanceState()會被調(diào)用。如果在ActivityB的頁面里用戶按Home退出,onSaveInstanceState()也是會被調(diào)用的。
相反的,如果用戶在ActivityB頁面按Back鍵返回ActivityA,此時,ActivityB的onSaveInstanceState()是不會被調(diào)用的。
再說從ActivityA跳轉(zhuǎn)到ActivityB的時候,還有個很奇怪的情況:
在Android P之前,ActivityA的onSaveInstanceState()是在onStop()之前被調(diào)用的,而且和ActivityA的onPause()的調(diào)用誰先誰后不確定!
在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的生命周期方法,其實是很基礎(chǔ)的知識。但是細(xì)摳的話,還是有不少細(xì)節(jié)的。
最后,還是拿這張大家都看過的圖來鎮(zhèn)樓:
