Android:Activity生命周期事件的幾個(gè)小細(xì)節(jié)

Activity跳轉(zhuǎn)生命周期事件您清楚嗎?

最近在面試的過(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的事件:


從ActivityA跳轉(zhuǎn)到ActivityB的事件

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

看看用戶(hù)從ActivityB返回ActivityA的情況:


從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)先。保證用戶(hù)體驗(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)的用戶(hù)體驗(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),讓用戶(hù)覺(jué)得不流暢。

而ActivityA的onStop()方法被調(diào)用的時(shí)候,ActivityB已經(jīng)在前臺(tái)了,所以可以在onStop()方法里做一些清理的工作,不會(huì)影響到用戶(hù)的體驗(yàn)。

onSaveInstanceState()方法的調(diào)用時(shí)機(jī)

Android里onSaveInstanceState()的調(diào)用時(shí)機(jī)也是讓人比較困惑的事情。首先,onSaveInstanceState()并不是Activity的生命周期方法,這意味著這個(gè)方法不是總會(huì)被調(diào)用的。只有在Activity可能會(huì)被系統(tǒng)銷(xiāo)毀的時(shí)候才可能被調(diào)用。

拿上面的例子來(lái)說(shuō),從ActivityA跳轉(zhuǎn)到ActivityB,ActivityA被壓在ActivityB下面,這種情況可能會(huì)被系統(tǒng)銷(xiāo)毀,所以onSaveInstanceState()會(huì)被調(diào)用。如果在ActivityB的頁(yè)面里用戶(hù)按Home退出,onSaveInstanceState()也是會(huì)被調(diào)用的。

相反的,如果用戶(hù)在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)用的。

下面是官方的解釋?zhuān)?/p>

If called, this method will occur after onStop() for applications targeting platforms starting with Build.VERSION_CODES.P. For applications targeting earlier platform versions this method will occur before onStop() and there are no guarantees about whether it will occur before or after onPause().

總結(jié)

Android的生命周期方法,其實(shí)是很基礎(chǔ)的知識(shí)。但是細(xì)摳的話(huà),還是有不少細(xì)節(jié)的。

最后,還是拿這張大家都看過(guò)的圖來(lái)鎮(zhèn)樓:


Activity的生命周期
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android的開(kāi)發(fā)中我們大部分都是和Activity打交道,而想很好的運(yùn)用Activity首先必須要清楚Acti...
    云天隨筆閱讀 1,336評(píng)論 0 1
  • 轉(zhuǎn)載請(qǐng)注明出處:http://www.itdecent.cn/p/1449e3ec2720 生命周期是個(gè)老生常談的...
    landptf閱讀 839評(píng)論 1 3
  • 說(shuō)起Activity大家都不陌生,它主要是跟用戶(hù)去打交道,其實(shí),它并不僅僅將視圖顯示給用戶(hù),它的背后隱藏的很大的知...
    ReturnYHH閱讀 965評(píng)論 0 5
  • 生命周期 關(guān)于Activity的生命周期相信不少人都覺(jué)得自己很了解了,畢竟大多數(shù)入門(mén)的時(shí)候都會(huì)首先學(xué)這個(gè),但事實(shí)真...
    斷了誰(shuí)的弦閱讀 2,267評(píng)論 0 2
  • 上次跑步是什么時(shí)候呢? 應(yīng)該是大學(xué),大學(xué)特別喜歡夜跑,操場(chǎng)上一圈一圈又一圈,把煩惱跑沒(méi)。 夜,是靜謐的。 夜像是你...
    Amoy_Amon閱讀 221評(píng)論 4 0

友情鏈接更多精彩內(nèi)容