Activity是在面試過程中經(jīng)常會被問到的四大組件之一窥摄,比如它的生命周期镶奉、啟動模式等等,在這里將詳細(xì)展開來講解崭放,不只是為了應(yīng)付面試哨苛,在平時的開發(fā)過程中,掌握這些知識也是很重要的币砂。
Q:Activity的生命周期建峭?
A:相信很多人都在網(wǎng)上看過這么一張圖片:
![這里寫圖片描述](http://hi.csdn.net/attachment/201007/28/0_12803210018q71.gif)
很多面試官會問你Activity的生命周期有哪些?
這個問題就很好回答了决摧,照著這個圖片依次說出來就好了亿蒸。
Q:當(dāng)dialog彈出來的時候,Activity執(zhí)行了哪些生命周期的方法掌桩,當(dāng)dialog消息的時候边锁,又執(zhí)行了哪些方法?
A:如果是單純是創(chuàng)建的dialog波岛,Activity并不會執(zhí)行生命周期的方法茅坛,但是如果是跳轉(zhuǎn)到一個不是全屏的Activity的話,當(dāng)然就是按照正常的生命周期來執(zhí)行了则拷,即onPasue()->onStop()贡蓖。
Q:設(shè)備橫豎屏切換的時候,Activity的生命周期是如何變化的煌茬?
A:不設(shè)置Activity的android:configChanges時摩梧,切屏?xí)匦抡{(diào)用各個生命周期,切橫屏?xí)r會執(zhí)行一次宣旱,切豎屏?xí)r會執(zhí)行兩次仅父;
設(shè)置Activity的android:configChanges="orientation"時,切屏還是會重新調(diào)用各個生命周期浑吟,切橫笙纤、豎屏?xí)r只會執(zhí)行一次;
設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時组力,切屏不會重新調(diào)用各個生命周期省容,只會執(zhí)行onConfigurationChanged方法;
tips:還有一點燎字,非常重要腥椒,一個Android的變更細(xì)節(jié)阿宅!
當(dāng)API >12時,需要加入screenSize屬性笼蛛,否則屏幕切換時即使你設(shè)置了orientation系統(tǒng)也會重建Activity洒放!
橫豎屏切換生命周期的執(zhí)行
Q:Activity的啟動模式有哪些?各有怎樣的作用滨砍?
A:
Activity一共有四種launchMode:standard往湿、singleTop、singleTask惋戏、singleInstance领追。
1.standard 模式是默認(rèn)的啟動模式,不用為配置android:launchMode屬性即可响逢。standard啟動模式绒窑,不管有沒有已存在的實例,都生成新的實例舔亭。
2.singleTop 我們在上面的基礎(chǔ)上為指定屬些膨,android:launchMode="singleTop",系統(tǒng)就會按照singleTop啟動模式處理跳轉(zhuǎn)行為分歇。跳轉(zhuǎn)時系統(tǒng)會先在棧結(jié)構(gòu)中尋找是否有一個Activity實例正位于棧頂傀蓉,如果有則不再生成新的欧漱,而是直接使用职抡。如果系統(tǒng)發(fā)現(xiàn)存在有Activity實例,但不是位于棧頂,重新生成一個實例误甚。 這就是singleTop啟動模式缚甩,如果發(fā)現(xiàn)有對應(yīng)的Activity實例正位于棧頂,則重復(fù)利用窑邦,不再生成新的實例擅威。
3.singleTask 如果發(fā)現(xiàn)有對應(yīng)的Activity實例,則使此Activity實例之上的其他Activity實例統(tǒng)統(tǒng)出棧冈钦,使此Activity實例成為棧頂對象郊丛,顯示到幕前。
4.singleInstance 這種啟動模式比較特殊瞧筛,因為它會啟用一個新的棧結(jié)構(gòu)厉熟,將Acitvity放置于這個新的棧結(jié)構(gòu)中,并保證不再有其他Activity實例進(jìn)入较幌。
Q:如何快速啟動一個Activity揍瑟?
A:這個問題其實也是比較簡單的,就是不要在Activity的onCreate方法中執(zhí)行過多繁重的操作乍炉,并且在onPasue方法中同樣不能做過多的耗時操作绢片。
Q:Activity的啟動流程
A:注意滤馍!這里并不是要回答Activity的生命周期!
這里可以參考:app的啟動
類似于app啟動如何創(chuàng)建并進(jìn)入MainActivity的底循。
Q:Activity異常退出該如何處理巢株?
A:
Activity異常退出的時候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),需要注意的是onSaveInstanceState() 方法與onPause并沒有嚴(yán)格的先后關(guān)系此叠,有可能在onPause之前纯续,也有可能在其后面調(diào)用,但會在onStop()方法之前調(diào)用灭袁;
異常退出后又重新啟動該Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume()猬错;
搞懂這個生命周期的執(zhí)行后就可以回答了,首先要知道面試官的意思茸歧,是要重新啟動并恢復(fù)這個Activity還是說直接退出整個app倦炒,如果要恢復(fù)則要在onSaveInstanceState()中進(jìn)行保存數(shù)據(jù)并在onRestoreInstanceState()中進(jìn)行恢復(fù),如果是要退出app的話就要捕獲全局的異常信息软瞎,并退出app逢唤。
當(dāng)然我建議是使用UncaughtExceotionHandler來捕獲全局異常進(jìn)行退出app的操作,這樣會減少之前崩潰所造成的后遺癥涤浇!
Q:Activity的onNewInstent()方法什么時候會執(zhí)行鳖藕?
A:這個是啟動模式中的了,當(dāng)此Activity的實例已經(jīng)存在只锭,并且此時的啟動模式為SingleTask和SingleInstance著恩,另外當(dāng)這個實例位于棧頂且啟動模式為SingleTop時也會觸發(fā)onNewInstent()。
Q:鎖定屏與解鎖屏幕蜻展,Activity如何執(zhí)行生命周期的喉誊?
A:只會調(diào)用onPause(),而不會調(diào)用onStop方法纵顾,開屏后則調(diào)用onResume()调缨。
Q:如何修改 Activity 進(jìn)入和退出動畫厚满?
A:
可 以 通 過 兩 種 方 式 唱蒸, 一 是 通 過 定 義 Activity 的 主 題 呈野, 二 是 通 過 覆 寫 Activity 的overridePendingTransition 方法。
通過設(shè)置主題樣式在 styles.xml 中編輯如下代碼:
添加 themes.xml 文件:
在 AndroidManifest.xml 中給指定的 Activity 指定 theme汉额。
覆寫 overridePendingTransition 方法:
overridePendingTransition(R.anim.fade, R.anim.hold);
Q:Activity間通過Intent傳遞數(shù)據(jù)大小有沒有限制曹仗?
A:Intent在傳遞數(shù)據(jù)時是有大小限制的,這里官方并未詳細(xì)說明闷愤,不過通過實驗的方法可以測出數(shù)據(jù)應(yīng)該被限制在1MB之內(nèi)(1024KB)整葡,筆者采用的是傳遞Bitmap的方法,發(fā)現(xiàn)當(dāng)圖片大小超過1024(準(zhǔn)確地說是1020左右)的時候讥脐,程序就會出現(xiàn)閃退遭居、停止運行等異常(不同的手機(jī)反應(yīng)不同)啼器,因此可以判斷Intent的傳輸容量在1MB之內(nèi)。
以上是個人的拙見俱萍,會不斷更新6丝恰!
To Be Continued...