1更鲁、說(shuō)下Activity生命周期 ?
onCreate()
表示Activity正在被創(chuàng)建奇钞,常用來(lái)做些初始化動(dòng)作澡为,比如調(diào)用setContentView()用來(lái)加載布局資源,初始化Activity數(shù)據(jù)景埃。
onReStart()
表示Acitivity正在被重新啟動(dòng)媒至,一般情況下,Acitivity從不見到可見時(shí)谷徙,都會(huì)被調(diào)用拒啰。
onStart()
表示Acitivity正在被啟動(dòng),此時(shí)Activity可見但不可動(dòng)即不處于前臺(tái)完慧,無(wú)法進(jìn)行互動(dòng)谋旦。
onResume()
表示Activity獲取到焦點(diǎn),此時(shí)Activity不但可見并處于前臺(tái)屈尼,進(jìn)行互動(dòng)操作蛤织。這是它與onStart()的區(qū)別所在。
onPause()
表示Activity正在被正在停止鸿染,此時(shí)可做一些存儲(chǔ)數(shù)據(jù),停止動(dòng)畫的動(dòng)作乞巧。但不可太過(guò)耗時(shí)涨椒,因?yàn)檫@會(huì)影響到新Activity的顯示,因?yàn)樾碌腁ctivity必須在前者的onPause()完成之后才會(huì)執(zhí)行onResume()。
onStop()
表示Activity即將停止蚕冬,此處可以做些重量級(jí)的回收工作免猾,比如銷毀廣播接收器,關(guān)閉網(wǎng)絡(luò)等囤热,同樣的猎提,不能太過(guò)耗時(shí)。
onDestory()
表示Activity即將被銷毀旁蔼,這是Activity最后一個(gè)回調(diào)锨苏,常用作回收工作,資源釋放等棺聊。
延伸:
從整個(gè)生命周期來(lái)看伞租,如果將之配對(duì)的話。
onCreate()與onDestory()為一對(duì)限佩,分別代表了Activity的創(chuàng)建與銷毀葵诈,并且有且只有一次調(diào)用。
onStart()與onStop()為一對(duì)祟同,依據(jù)為是否可見作喘,兩個(gè)方法可被多次調(diào)用。
onResume()與onPause()為一對(duì)晕城,依據(jù)為是否處于前臺(tái)泞坦,兩個(gè)方法也可被多次調(diào)用。
2广辰、Activity A 啟動(dòng)另一個(gè)Activity B 會(huì)調(diào)用哪些方法暇矫?如果B是透明主題的又或則是個(gè)DialogActivity呢 ?
A onPause()→B onCreate()→onStart()→onResume()→A onStop()
如果B是透明主題择吊,或者為DialogActivity李根,A不會(huì)執(zhí)行最后的onStop()方法。
3几睛、說(shuō)下onSaveInstanceState()方法的作用 ? 何時(shí)會(huì)被調(diào)用房轿?
Activity在意外銷毀的狀況下(系統(tǒng)配置發(fā)生改變時(shí)導(dǎo)致Activity被殺死并重新創(chuàng)建、資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死)所森,Activity會(huì)調(diào)用onSaveInstanceState()方法囱持,來(lái)保存Activity的狀態(tài),此方法執(zhí)行在onStop之前焕济,而與onPause方法沒(méi)有既定的時(shí)序關(guān)系纷妆。
當(dāng)Activity被重建后,Activity會(huì)調(diào)用onRestoreInstanceState()方法晴弃,并把在onSaveInstanceState()方法中保存的Bundle對(duì)象傳參給onRestoreInstanceState()和onCreate()掩幢,因此我們可以通過(guò)這兩個(gè)方法逊拍,來(lái)判斷該Activity是否被重建,而該方法是調(diào)用在onStart()之后际邻。
4芯丧、說(shuō)下 Activity的四種啟動(dòng)模式、應(yīng)用場(chǎng)景 世曾?
standard標(biāo)準(zhǔn)模式:每次啟動(dòng)一個(gè)Activity不管該Activity是否存在缨恒,都會(huì)重新創(chuàng)建一個(gè)新的Activity實(shí)例,而此模式創(chuàng)建的實(shí)例轮听,會(huì)默認(rèn)進(jìn)入啟動(dòng)它的Activity所處的任務(wù)棧中骗露。
singleTop棧頂復(fù)用模式:每次啟動(dòng)Activity,會(huì)先確認(rèn)該Activity是否處于棧頂位置蕊程。如果是椒袍,則不會(huì)重新創(chuàng)建新的Activity,同時(shí)會(huì)回調(diào)onNewIntent()方法藻茂。如果不是驹暑,則會(huì)重新去創(chuàng)建一個(gè)新的實(shí)例。
singleTask棧內(nèi)復(fù)用模式:每次啟動(dòng)Activity辨赐,會(huì)搜尋Activity是否處于某個(gè)棧中优俘,如果存在,則不會(huì)重新創(chuàng)建新的實(shí)例掀序,如果不存在呀邢,則會(huì)重新創(chuàng)建一個(gè)任務(wù)棧淮悼,并將Activity放入該棧內(nèi)。
singleInstance單實(shí)例模式:一種加強(qiáng)版的singleTask模式,具有此模式的Activity只能單獨(dú)地存在一個(gè)任務(wù)棧中濒翻,任務(wù)棧之中有且只有一個(gè)實(shí)例乍迄。
5泌霍、了解哪些Activity常用的標(biāo)記位Flags甲抖?
FLAG_ACTIVITY_NEW_TASK:對(duì)應(yīng)singleTask,其效果與在XML指定啟動(dòng)模式相同沾瓦。
FLAG_ACTIVITY_SINGLE_TOP:對(duì)應(yīng)singleTop满着,其效果與在XML指定啟動(dòng)模式相同。
FLAG_ACTIVITY_CLEAR_TOP:具有此標(biāo)記的Activity贯莺,當(dāng)它啟動(dòng)時(shí)风喇,會(huì)將其所在任務(wù)棧自身之上的Activity悉數(shù)移出棧,這個(gè)標(biāo)識(shí)一般會(huì)與singleTask模式一起出現(xiàn)缕探,在這種情況下魂莫,如果目標(biāo)Activity存在,則會(huì)回調(diào)onNewIntent()方法爹耗,如果是standard模式耙考,則會(huì)連同存在的當(dāng)前Activity一起移出棧頂秽誊,而后重新創(chuàng)建一個(gè)新的實(shí)例并放入棧中。
FLAG_ACTIVITY_EXCLUDE_FORM_RECENT:具有該標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Activity列表中琳骡。
6、說(shuō)下 Activity跟window讼溺,view之間的關(guān)系楣号?
Activity在創(chuàng)建時(shí)會(huì)通過(guò)attach()方法初始化一個(gè)phoneWindow(繼承于Window),每一個(gè)Activity都包含有一個(gè)phoneWindow怒坯。
Activity可通過(guò)setContentView()實(shí)際上是通過(guò)getWindow().setContentView()將View設(shè)置到phoneWindow之上炫狱,而phoneWindow則是通過(guò)內(nèi)部的WindowManager的addView,removeView剔猿,updateViewLayout來(lái)管理View视译。實(shí)際上WindowManager相當(dāng)于接口,最終由WindowMangerImp來(lái)實(shí)現(xiàn)
7归敬、橫豎屏切換的Activity生命周期變化酷含?
不設(shè)置Activity的android:configChange=“orientation”時(shí),橫豎屏切換會(huì)摧毀當(dāng)前Activity汪茧,并重新加載調(diào)用各個(gè)周期椅亚。切橫屏?xí)r調(diào)用一次,豎屏?xí)r調(diào)用兩次舱污。onPause()→onStop()→onDestory()→onCreate()→onStart()→onReSume()
如果設(shè)置了android:configChange="orentation"屬性時(shí)呀舔,
在android5.1即API23級(jí)以下時(shí)
Activity依舊會(huì)重新調(diào)用生命周期
在android9即API28級(jí)以下時(shí)
Activity不再需要調(diào)用各個(gè)生命周期,而是只會(huì)執(zhí)行扩灯,onConfigurationChange()方法
如果是android3.2即API13以上媚赖,還需要設(shè)置screenSize配置,因?yàn)?b>當(dāng)橫豎屏切換時(shí)珠插,該屬性也會(huì)發(fā)生變化惧磺,如果設(shè)置了該屬性,之后即便橫豎屏切換丧失,此配置變換Activity也不會(huì)再重新啟動(dòng)豺妓。
8、如何啟動(dòng)其他應(yīng)用的Activity布讹?
在保證有權(quán)限的情況下琳拭,一般通過(guò)隱式Intent去與目標(biāo)Activity的intent-Filter進(jìn)行匹配。
只有與目標(biāo)Activity的intent-Filter的action描验,category白嘁,data全部匹配成功,才能啟動(dòng)目標(biāo)Activity
以個(gè)Activity可以擁有多個(gè)intent-Filter膘流,所以發(fā)起intent只要匹配到其中一組絮缅,就能夠啟動(dòng)目標(biāo)Activity鲁沥。
9、Activity的啟動(dòng)過(guò)程耕魄?(重點(diǎn))
點(diǎn)擊App圖標(biāo)后通過(guò)startActivity調(diào)用到遠(yuǎn)程AMS調(diào)用中画恰,調(diào)用中AMS將新Activity以activityRecord的方式壓入Activity棧中,并通過(guò)遠(yuǎn)程Binder回調(diào)到原進(jìn)程吸奴,使其進(jìn)入pause狀態(tài) 允扇,原進(jìn)程再通過(guò)binder告知AMS我已pause
AMS再根據(jù)棧中的Activity的啟動(dòng)的intent中的flag標(biāo)簽中是否有new_task標(biāo)簽,來(lái)判斷是否要啟動(dòng)新的進(jìn)程则奥。啟動(dòng)新進(jìn)沖通過(guò)調(diào)用startProcessXXX的函數(shù)考润。
啟動(dòng)新進(jìn)程后,通過(guò)反射調(diào)用Activity的ActivityThread的main函數(shù)读处,main函數(shù)中調(diào)用looper.prepar和looper.loop啟動(dòng)消息隊(duì)列循環(huán)機(jī)制,最后遠(yuǎn)程告知AMS我啟動(dòng)了糊治。AMS再通過(guò)回調(diào)handleLauncherActivity加載Activity。在handlerLaucherActivity中通過(guò)反射調(diào)用Application的onCreate和Activity的onCreate以及通過(guò)handleResumeActivity中反射調(diào)用Activity的onResume罚舱。