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

Activity是在面試過程當中常常會被問到的四大組件之一,好比它的生命週期、啓動模式等等,在這裏將詳細展開來說解,不僅是爲了應付面試,在平時的開發過程當中,掌握這些知識也是很重要的。html

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

這裏寫圖片描述
這裏寫圖片描述

不少面試官會問你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!
橫豎屏切換生命週期的執行app

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實例進入。ide

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

Q:Activity的啓動流程
A:注意!這裏並非要回答Activity的生命週期!
這裏能夠參考:app的啓動
相似於app啓動如何建立並進入MainActivity的。ui

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的操做,這樣會減小以前崩潰所形成的後遺症!.net

Q:Activity的onNewInstent()方法何時會執行?
A:這個是啓動模式中的了,當此Activity的實例已經存在,而且此時的啓動模式爲SingleTask和SingleInstance,另外當這個實例位於棧頂且啓動模式爲SingleTop時也會觸發onNewInstent()。cdn

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

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...

相關文章
相關標籤/搜索