一道經典的Android面試題

WilhelminaR 7年前發布 | 9K 次閱讀 安卓開發 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

 

 本文由用戶 WilhelminaR 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!