面試題: 怎么理解Activity的生命周期妖枚?
這是一道幾乎必問的Android面試題廷臼,當(dāng)聽到這題時(shí)大家的神經(jīng)都會(huì)麻木,你問我背绝页。說實(shí)話荠商,如果你問我怎么理解,我也很難回答续誉,因?yàn)檫@個(gè)問題太寬泛了结啼,答什么都可以又答什么都難答好。有一次電話面試問了一個(gè)人屈芜,對(duì)方直接說不要問這種在網(wǎng)上到處都能看到的題郊愧,他只要上網(wǎng)一查就會(huì)。好吧井佑,我脾氣好属铁,就接著問:
“那問什么題呢?”
“邏輯的躬翁,算法的焦蘑,業(yè)務(wù)什么的,就是純JAVA代碼的盒发±觯”
“那么熟悉什么算法呢?”
“宁舰。拼卵。÷瑁”(沒答上)
但Activity的生命周期又至關(guān)重要腋腮,不問好像又對(duì)不起彼此。根據(jù)得到的反饋我后來稍稍改變了一下提問方式壤蚜,不問怎么理解即寡,而是給幾個(gè)場(chǎng)景問怎么使用回調(diào)或回調(diào)的順序(或要注意什么),從側(cè)面看是否真正理解了袜刷。
下面還是先過一下官網(wǎng)上的Activity生命周期圖聪富,注意幾個(gè)框線其實(shí)代表又可以細(xì)分為不同的周期。
如果一個(gè)Activity在用戶可見時(shí)才處理某個(gè)廣播著蟹,不可見時(shí)注銷掉墩蔓,那么應(yīng)該在哪兩個(gè)生命周期的回調(diào)方法去注冊(cè)和注銷BroadcastReceiver呢梢莽?
Activity 的可見生命周期發(fā)生在 onStart調(diào)用與 onStop調(diào)用之間。在這段時(shí)間钢拧,用戶可以在屏幕上看到 Activity 并與其交互。我們可以在 onStart中注冊(cè)一個(gè) BroadcastReceiver以監(jiān)控影響 UI 的變化炕横,并在用戶無法再看到您顯示的內(nèi)容時(shí)在 onStop中將其取消注冊(cè)源内。
如果對(duì)方回答是在onResume和onPause方法中,那么你可以去引導(dǎo)對(duì)方看看在這兩個(gè)方法有什么不好的地方份殿。
如果有一些數(shù)據(jù)在Activity跳轉(zhuǎn)時(shí)(或者離開時(shí))要保存到數(shù)據(jù)庫(kù)膜钓,那么你認(rèn)為是在onPause好還是在onStop執(zhí)行這個(gè)操作好呢?
這題的要點(diǎn)和上一題是一樣的卿嘲,onPause較容易被觸發(fā)颂斜,所以我們?cè)谧鯞roadcastReceiver注銷時(shí)放在onStop要好些。onPause時(shí)Activity界面仍然是可見的拾枣,如彈出一個(gè)Dialog時(shí)沃疮。但在保存數(shù)據(jù)時(shí),放在onPause去做可以保證數(shù)據(jù)存儲(chǔ)的有效性梅肤,如果放在onStop去做司蔬,在某些情況下Activity走完onPause后有可能還沒順利走到onStop就被系統(tǒng)回收了。
但要注意在onPause中要非常迅速地執(zhí)行完所需操作姨蝴,不然會(huì)影響到下一個(gè)Activity的生命周期函數(shù)的調(diào)用俊啼。
簡(jiǎn)單說一下Activity A啟動(dòng)Activity B時(shí),兩個(gè)Activity生命周期的變化左医。
當(dāng)一個(gè) Activity 啟動(dòng)另一個(gè) Activity 時(shí)授帕,它們都會(huì)發(fā)生生命周期轉(zhuǎn)變。第一個(gè) Activity 暫停然后停止(但如果它在后臺(tái)仍然可見浮梢,則不會(huì)停止跛十,比如B是半透明的),系統(tǒng)會(huì)創(chuàng)建另一個(gè) Activity秕硝。 如果這兩個(gè)Activity 共用保存數(shù)據(jù)到文件或者數(shù)據(jù)庫(kù)偶器,必須要注意,在創(chuàng)建第二個(gè) Activity 前缝裤,第一個(gè) Activity 不會(huì)完全停止屏轰。更確切地說,啟動(dòng)第二個(gè) Activity 的過程與停止第一個(gè) Activity 的過程存在重疊憋飞。
以下是當(dāng) Activity A 啟動(dòng) Activity B 時(shí)一系列操作的發(fā)生順序:
Activity A 的 onPause方法執(zhí)行霎苗。
Activity B 的 onCreate、onStart和 onResume方法依次執(zhí)行榛做。
然后唁盏,如果 Activity A 在屏幕上不再可見内狸,則其 onStop方法執(zhí)行。
您可以利用這種可預(yù)測(cè)的生命周期回調(diào)順序管理從一個(gè) Activity 到另一個(gè) Activity 的信息轉(zhuǎn)變厘擂。 例如昆淡,如果您必須在第一個(gè) Activity 停止時(shí)向數(shù)據(jù)庫(kù)寫入數(shù)據(jù),以便下一個(gè) Activity 能夠讀取該數(shù)據(jù)刽严,則應(yīng)在 onPause而不是 onStop執(zhí)行期間向數(shù)據(jù)庫(kù)寫入數(shù)據(jù)昂灵。
小結(jié)
這幾個(gè)問題看似簡(jiǎn)單,其實(shí)還是很能問出面試者是否真正理解Activity生命周期的轉(zhuǎn)變舞萄。經(jīng)常有人會(huì)問眨补,知道這些有什么用?又不能提升編程能力倒脓?編程能力是一個(gè)很復(fù)雜的體系撑螺,不能光看有技術(shù)含量或者高大上的算法才叫有能力,和悟道一樣崎弃,我認(rèn)為認(rèn)識(shí)理清Android體系甘晤,順應(yīng)它的道(機(jī)制)開發(fā)應(yīng)用也是一種能力。