一道經典的Android面試題
摘要
今天,給各位分享一個很有意思,而且非常經典的Android面試題。
試題引入
題目:原Activity啟動一個新Activity,然后關閉這個新Activity回到原Activty,在這個過程中這兩個Activity的生命周期經歷了怎樣的變化?
很多面試者給出了這樣的答案:
activity_error.png
答案真的如此嗎?
╮( ̄▽  ̄)╭ 相信一些有經驗的老司機們已經開始笑了~
其實,這是一個很簡單的問題,打印一下Log日志就知道結果了。
接下來,Blogger給各位實驗下,但不再貼代碼了,直接把Log日志截出來就OK了。
注:額外添加onRestoreInstanceState、onSaveInstanceState等方法完善了一下Activity生命周期的調用過程。
......
/ 啟動 NewActivity /
com.sina.wangnan7.originactivity E/TAG: onPause(OriginActivity)
com.sina.wangnan7.originactivity E/TAG: onCreate(NewActivity)
com.sina.wangnan7.originactivity E/TAG: onStart(NewActivity)
com.sina.wangnan7.originactivity E/TAG: onResume(NewActivity)
com.sina.wangnan7.originactivity E/TAG: onSaveInstanceState(OriginActivity)
com.sina.wangnan7.originactivity E/TAG: onStop(OriginActivity)
/ 關閉 NewActivity /
com.sina.wangnan7.originactivity E/TAG: onPause(NewActivity)
com.sina.wangnan7.originactivity E/TAG: onRestart(OriginActivity)
com.sina.wangnan7.originactivity E/TAG: onStart(OriginActivity)
com.sina.wangnan7.originactivity E/TAG: onResume(OriginActivity)
com.sina.wangnan7.originactivity E/TAG: onStop(NewActivity)
com.sina.wangnan7.originactivity E/TAG: onDestroy(NewActivity)
......</code></pre>
開始分析
- 在啟動NewActivity的時候 ,OriginActivity執行完onPause方法就停住了,直到NewActivity創建并執行完onResume方法后才繼續向下執行,然后一直執行完onStop才停下。
- 在關閉NewActivity的時候 ,NewActivity執行完onPause方法也停住了,直到OriginActivity重啟并執行完onResume方法后才繼續向下執行,然后一直執行完onDestroy方法變成被銷毀的狀態。
What?Why?...(⊙o⊙)
驚訝之后我們可以靜靜的想一下『Google為什么要這樣設計?』
其實,這是對『用戶體驗』的一種優化,在啟動一個新活動時,我們應當以最快的速度響應新活動并將界面呈現給用戶,而不是等到當前的活動完全停止后再去啟動新活動。同樣,在回退到上一個活動時,我們也應當以最快的速度去呈現上一個活動的界面,而不是等到當前活動被完全銷毀后才去重啟之前的活動。
分析之后,我們還能提煉出一條『編程經驗』:
應盡量避免在onPause方法中做一些耗時操作(比如數據庫操作),以免影響『新活動的啟動』或『舊活動的重啟』。
答案總結
為了讓答案更全面,Blogger接下來會以三種情況進行總結。
- 啟動一個正常的NewActivity(完全遮擋OriginActivity),之后回退到正常狀態的OriginActivity。

activity_normal1.png
- 啟動一個正常的NewActivity(完全遮擋OriginActivity),之后回退到異常狀態的OriginActivity(例如:可用內存不足,活動被系統回收了)。

activity_normal2.png
- 啟動一個對話框主題的NewActivity(部分遮擋OriginActivity),之后回退到正常狀態的OriginActivity。

activity_normal3.png
至此,我們的答案已經總結完了,可能你還會疑惑有沒有『啟動一個對話框主題的NewActivity(部分遮擋OriginActivity),之后回退到異常狀態的OriginActivity』這種情況。我只能說幾乎沒有, 因為Android系統一般不會去回收一個在屏幕上還可見的Activity,那樣會造成非常差的『用戶體驗』 ,如果你真遇到這種情況,我只能說:親~,趕緊換手機吧!O(∩_∩)O~
來自:http://www.jianshu.com/p/422c167020eb