Android面試常客--四大元件之Activity

mehao發表於2017-11-01

Activity是在面試過程中經常會被問到的四大元件之一,比如它的生命週期、啟動模式等等,在這裡將詳細展開來講解,不只是為了應付面試,在平時的開發過程中,掌握這些知識也是很重要的。

Q:Activity的生命週期?
A:相信很多人都在網上看過這麼一張圖片:

這裡寫圖片描述
這裡寫圖片描述

很多面試官會問你Activity的生命週期有哪些?
這個問題就很好回答了,照著這個圖片依次說出來就好了。

Q:當dialog彈出來的時候,Activity執行了哪些生命週期的方法,當dialog訊息的時候,又執行了哪些方法?
A:如果是單純是建立的dialog,Activity並不會執行生命週期的方法,但是如果是跳轉到一個不是全屏的Activity的話,當然就是按照正常的生命週期來執行了,即onPasue()->onStop()。

Q:裝置橫豎屏切換的時候,Activity的生命週期是如何變化的?
A:不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次;
設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次;
設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法;
tips:還有一點,非常重要,一個Android的變更細節!
當API >12時,需要加入screenSize屬性,否則螢幕切換時即使你設定了orientation系統也會重建Activity!
橫豎屏切換生命週期的執行

Q:Activity的啟動模式有哪些?各有怎樣的作用?
A:
Activity一共有四種launchMode:standard、singleTop、singleTask、singleInstance。
1.standard 模式是預設的啟動模式,不用為配置android:launchMode屬性即可。standard啟動模式,不管有沒有已存在的例項,都生成新的例項。
2.singleTop 我們在上面的基礎上為指定屬,android:launchMode="singleTop",系統就會按照singleTop啟動模式處理跳轉行為。跳轉時系統會先在棧結構中尋找是否有一個Activity例項正位於棧頂,如果有則不再生成新的,而是直接使用。如果系統發現存在有Activity例項,但不是位於棧頂,重新生成一個例項。 這就是singleTop啟動模式,如果發現有對應的Activity例項正位於棧頂,則重複利用,不再生成新的例項。
3.singleTask 如果發現有對應的Activity例項,則使此Activity例項之上的其他Activity例項統統出棧,使此Activity例項成為棧頂物件,顯示到幕前。
4.singleInstance 這種啟動模式比較特殊,因為它會啟用一個新的棧結構,將Acitvity放置於這個新的棧結構中,並保證不再有其他Activity例項進入。

Q:如何快速啟動一個Activity?
A:這個問題其實也是比較簡單的,就是不要在Activity的onCreate方法中執行過多繁重的操作,並且在onPasue方法中同樣不能做過多的耗時操作。

Q:Activity的啟動流程
A:注意!這裡並不是要回答Activity的生命週期!
這裡可以參考:app的啟動
類似於app啟動如何建立並進入MainActivity的。

Q:Activity異常退出該如何處理?
A:
Activity異常退出的時候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),需要注意的是onSaveInstanceState() 方法與onPause並沒有嚴格的先後關係,有可能在onPause之前,也有可能在其後面呼叫,但會在onStop()方法之前呼叫;
異常退出後又重新啟動該Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume();
搞懂這個生命週期的執行後就可以回答了,首先要知道面試官的意思,是要重新啟動並恢復這個Activity還是說直接退出整個app,如果要恢復則要在onSaveInstanceState()中進行儲存資料並在onRestoreInstanceState()中進行恢復,如果是要退出app的話就要捕獲全域性的異常資訊,並退出app。
當然我建議是使用UncaughtExceotionHandler來捕獲全域性異常進行退出app的操作,這樣會減少之前崩潰所造成的後遺症!

Q:Activity的onNewInstent()方法什麼時候會執行?
A:這個是啟動模式中的了,當此Activity的例項已經存在,並且此時的啟動模式為SingleTask和SingleInstance,另外當這個例項位於棧頂且啟動模式為SingleTop時也會觸發onNewInstent()。

Q:鎖定屏與解鎖螢幕,Activity如何執行生命週期的?
A:只會呼叫onPause(),而不會呼叫onStop方法,開屏後則呼叫onResume()。

Q:如何修改 Activity 進入和退出動畫?
A:
可 以 通 過 兩 種 方 式 , 一 是 通 過 定 義 Activity 的 主 題 , 二 是 通 過 覆 寫 Activity 的overridePendingTransition 方法。
通過設定主題樣式在 styles.xml 中編輯如下程式碼:
新增 themes.xml 檔案:
在 AndroidManifest.xml 中給指定的 Activity 指定 theme。
覆寫 overridePendingTransition 方法:
overridePendingTransition(R.anim.fade, R.anim.hold);

Q:Activity間通過Intent傳遞資料大小有沒有限制?
A:Intent在傳遞資料時是有大小限制的,這裡官方並未詳細說明,不過通過實驗的方法可以測出資料應該被限制在1MB之內(1024KB),筆者採用的是傳遞Bitmap的方法,發現當圖片大小超過1024(準確地說是1020左右)的時候,程式就會出現閃退、停止執行等異常(不同的手機反應不同),因此可以判斷Intent的傳輸容量在1MB之內。

以上是個人的拙見,會不斷更新!!

To Be Continued...

相關文章