Android面試一天一題(3 Day)

面試題: 怎么理解Activity的生命周期?

這是一道幾乎必問的Android面試題,當(dāng)聽到這題時(shí)大家的神經(jīng)都會(huì)麻木,你問我背。說實(shí)話,如果你問我怎么理解,我也很難回答,因?yàn)檫@個(gè)問題太寬泛了,答什么都可以又答什么都難答好。有一次電話面試問了一個(gè)人,對方直接說不要問這種在網(wǎng)上到處都能看到的題,他只要上網(wǎng)一查就會(huì)。好吧,我脾氣好,就接著問:
“那問什么題呢?”
“邏輯的,算法的,業(yè)務(wù)什么的,就是純JAVA代碼的。”
“那么熟悉什么算法呢?”
“。。。”(沒答上)

但Activity的生命周期又至關(guān)重要,不問好像又對不起彼此。根據(jù)得到的反饋我后來稍稍改變了一下提問方式,不問怎么理解,而是給幾個(gè)場景問怎么使用回調(diào)或回調(diào)的順序(或要注意什么),從側(cè)面看是否真正理解了。

下面還是先過一下官網(wǎng)上的Activity生命周期圖,注意幾個(gè)框線其實(shí)代表又可以細(xì)分為不同的周期。


如果一個(gè)Activity在用戶可見時(shí)才處理某個(gè)廣播,不可見時(shí)注銷掉,那么應(yīng)該在哪兩個(gè)生命周期的回調(diào)方法去注冊和注銷BroadcastReceiver呢?

Activity 的可見生命周期發(fā)生在 onStart調(diào)用與 onStop調(diào)用之間。在這段時(shí)間,用戶可以在屏幕上看到 Activity 并與其交互。我們可以在 onStart中注冊一個(gè) BroadcastReceiver以監(jiān)控影響 UI 的變化,并在用戶無法再看到您顯示的內(nèi)容時(shí)在 onStop中將其取消注冊。

如果對方回答是在onResume和onPause方法中,那么你可以去引導(dǎo)對方看看在這兩個(gè)方法有什么不好的地方。

如果有一些數(shù)據(jù)在Activity跳轉(zhuǎn)時(shí)(或者離開時(shí))要保存到數(shù)據(jù)庫,那么你認(rèn)為是在onPause好還是在onStop執(zhí)行這個(gè)操作好呢?

這題的要點(diǎn)和上一題是一樣的,onPause較容易被觸發(fā),所以我們在做BroadcastReceiver注銷時(shí)放在onStop要好些。onPause時(shí)Activity界面仍然是可見的,如彈出一個(gè)Dialog時(shí)。但在保存數(shù)據(jù)時(shí),放在onPause去做可以保證數(shù)據(jù)存儲的有效性,如果放在onStop去做,在某些情況下Activity走完onPause后有可能還沒順利走到onStop就被系統(tǒng)回收了。

但要注意在onPause中要非常迅速地執(zhí)行完所需操作,不然會(huì)影響到下一個(gè)Activity的生命周期函數(shù)的調(diào)用。

簡單說一下Activity A啟動(dòng)Activity B時(shí),兩個(gè)Activity生命周期的變化。

當(dāng)一個(gè) Activity 啟動(dòng)另一個(gè) Activity 時(shí),它們都會(huì)發(fā)生生命周期轉(zhuǎn)變。第一個(gè) Activity 暫停然后停止(但如果它在后臺仍然可見,則不會(huì)停止,比如B是半透明的),系統(tǒng)會(huì)創(chuàng)建另一個(gè) Activity。 如果這兩個(gè)Activity 共用保存數(shù)據(jù)到文件或者數(shù)據(jù)庫,必須要注意,在創(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ù)測的生命周期回調(diào)順序管理從一個(gè) Activity 到另一個(gè) Activity 的信息轉(zhuǎn)變。 例如,如果您必須在第一個(gè) Activity 停止時(shí)向數(shù)據(jù)庫寫入數(shù)據(jù),以便下一個(gè) Activity 能夠讀取該數(shù)據(jù),則應(yīng)在 onPause而不是 onStop執(zhí)行期間向數(shù)據(jù)庫寫入數(shù)據(jù)。

小結(jié)

這幾個(gè)問題看似簡單,其實(shí)還是很能問出面試者是否真正理解Activity生命周期的轉(zhuǎn)變。經(jīng)常有人會(huì)問,知道這些有什么用?又不能提升編程能力?編程能力是一個(gè)很復(fù)雜的體系,不能光看有技術(shù)含量或者高大上的算法才叫有能力,和悟道一樣,我認(rèn)為認(rèn)識理清Android體系,順應(yīng)它的道(機(jī)制)開發(fā)應(yīng)用也是一種能力。

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

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

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