前言
??我們在Android開發(fā)中離不開四大組件构蹬,Activity更是重中之重窃诉,只要開發(fā)Android都要與它打交道婴程,都知道它就是一個界面用來顯示各種UI控件序攘,接收用戶輸入并且與用戶交互等等功能穿稳,至于它的啟動方式也是早于爛熟于心存皂,在Manifest.xml里面使用activity標(biāo)簽開申明它,要啟動的話就是用intent去啟動逢艘,以上這些全部都是基于Android系統(tǒng)封裝好旦袋,成為api,所以直接使用即可它改,但是作為一個Android開發(fā)者怎么能去了解里面具體實現(xiàn)呢疤孕,也為了以后更好的開(zhuang)發(fā)(bi)。
??一個Activity的啟動是非常非常復(fù)雜的央拖,里面的代碼可以看到腦袋爆炸祭阀,然后你會發(fā)現(xiàn)看暈了,還是沒看出什么結(jié)果鲜戒,所以我們只要看一些主要的方法和流程专控,只要知道這一步干了什么即可,下面開始進(jìn)入正題遏餐。
Activity的啟動
??首先啟動一個Activity伦腐,當(dāng)然是在Activity里的startActivity
方法啦
startActivity
方法最終調(diào)的是startActivityForResult
這個方法,當(dāng)然這個startActivityForResult
又是一堆各種不同參數(shù)的方法失都,我們直接就跑到具體的代碼柏蘑,execStartActivity
方法,這個方法是Instrumentation
類里面的粹庞,這個類就是用來檢測代碼的辩越,有興趣可以去查下具體作用,具體看下execStartActivity
方法ActivityManagerNative.getDefault().startActivity
和checkStartActivityResult
黔攒,先說下簡單的checkStartActivityResult
have you declared this activity in your AndroidManifest.xml?
强缘,由此可知這個方法就是判斷Activity各種情況督惰。繼續(xù)說ActivityManagerNative.getDefault().startActivity
,這個ActivityManagerNative
是一個Binder旅掂,用來遠(yuǎn)程通信的赏胚,這里具體不說了,其實就是遠(yuǎn)程通信告訴ActivityManagerService(AMS)
要啟動一個Activity商虐,調(diào)用AMS的startActivity
一眼就看到最后調(diào)的其實是stackSuoerVisor類的
startActivityMayWait
觉阅,這個類其實就是運(yùn)行所有ActivityStack的崖疤,這個后面還會說到,這兩個類很關(guān)鍵典勇,最后進(jìn)到這個方法以后劫哼,會發(fā)現(xiàn)一堆代碼,這里我也只是說下startActivityLocked
這個主要方法割笙,這個方法就是啟動activity的权烧,至于方法名字為什么加個Locked應(yīng)該是跟這是在synchronized
里面有關(guān)吧,繼續(xù)往里面走伤溉,也是一堆代碼般码,各種賦值各種判斷,里面有個很重要的是ActivityRecord被new出來了乱顾,這是個存了Activity所有信息的類板祝,這里也不多說,還是看關(guān)鍵的方法startActivityUncheckedLocked
這個方法就是在棧中各種對activity判斷走净,還是看關(guān)鍵方法resumeTopActivitiesLocked
這里面就把運(yùn)行這個activity的棧也就是ActivityStack這個類券时,調(diào)用它的resumeTopActivityLocked
方法,在這方法中又調(diào)用resumeTopActivityInnerLocked
方法温技,使用stackSupervisor(這里又回到了stackSupervisor)的startSpecificActivityLocked
方法,這名字也很形象扭粱,開始一個具體的activity舵鳞,在它里面有一個realStartActivity
方法也是一堆代碼,主要的就是scheduleLaunchActivity
sendMessage(H.LAUNCH_ACTIVITY, r)
方法,說白了就是通過ActivityThread中的Handler發(fā)送了一個消息LAUNCH_ACTIVITY給handler處理博其,收到這個消息后調(diào)用了handleLaunchActivity
方法performLaunchActivity
方法這里面又調(diào)用了Instrumentation類的callActivityOnCreate
方法看名字就知道終于一整流程走完了套才,要回調(diào)Activity的onCreate方法了,事實上確實是這樣自此Activity啟動流程全部走完慕淡,當(dāng)然還有一個重要的就是PhoneWindow的創(chuàng)建背伴,這個是在performLaunchActivity里面的attach方法創(chuàng)建的,這個下次在說峰髓。
總結(jié)
??具體流程畫了一下傻寂,雖然畫的不太好,但是要啥自行車携兵,嘿嘿