一道經典的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)
......

注:有朋友在親手實驗時,發現onSaveInstanceState方法并沒有調用,所以提醒一句,
onSaveInstanceState其實有兩個重載的方法:
①onSaveInstanceState(Bundle outState)
②onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
可以都試下,第①個方法是會輸出的。

開始分析

  • 在啟動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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容