9.2 Activity的工作過(guò)程
啟動(dòng)一個(gè)activity,顯示狀態(tài)下,可以用過(guò)startActivity(new Intent(this,TextActivity.class))
startActivity方法有好幾種重載的方法,但是他們最終會(huì)調(diào)用startActivityForResult方法。在這個(gè)方法中調(diào)用了Instrumentation的execStartActivity.在這個(gè)方法中,ActivityManagerNative.getDefault().startActivity方法實(shí)現(xiàn)。ActivityManagerService繼承自ActivityManagerNative,而ActivityManagerNative繼承自Binder并實(shí)現(xiàn)了IActivitymanager這個(gè)Binder接口。ActivityManagerNative具體實(shí)現(xiàn)是ActivityManagerService(AMS)。 在ActivityManagerNative中,AMS這個(gè)Binder對(duì)象采用單例模式對(duì)外提供,Singleton是一個(gè)單例的封裝類。第一次調(diào)用他的get方法他會(huì)通過(guò)create方法來(lái)初始化AMS這個(gè)Binder對(duì)象。在后續(xù)的調(diào)用中則直接返回之前創(chuàng)建的對(duì)象。AMS中srtartActivity調(diào)用的ActivityStackSupervisor.startActivityMayWait方法,在startActivityMayWait中調(diào)用了startActivityLocked,然后在startActivityLocked有調(diào)用了startActivityUncheckedLocked,接著startActivityUnckeckLocked有調(diào)用了ActivityStack的resumeTopActivityLocked,resumeTopActivityLocked調(diào)用了ResumeTopActivityInnnerLocked。resumeTopActivityInnerLocked方法又調(diào)用了ActivityStackSupervistor的startSpecificActivityLocked方法。startSpecificActivityLocked方法調(diào)用了realStartActivityLocked。在ActivityStackSuporvistor中調(diào)用了app.thread.scheduleLauchActivity() 其中app.thread的類型為IApplicationThread。IApplicationThread實(shí)現(xiàn)者是ActivityThread中的內(nèi)部類ApplicationThread。ApplicationThread繼承了ApplicationThreadNative,而ApplicationThreadNative則繼承了Binder并實(shí)現(xiàn)了IApplicationThread類。繞了一大圈Activity的啟動(dòng)過(guò)程最終回到了ApplicationThread中scheduleLaunchActivity來(lái)啟動(dòng)Activity,在ApplicationThread中schedulelaunchActivity實(shí)現(xiàn)很簡(jiǎn)單,就是發(fā)送了一個(gè)啟動(dòng)Activity的消息交由handler處理,這個(gè)Handler有一個(gè)簡(jiǎn)潔的名字H,sendMessage的作用就是發(fā)送一個(gè)消息給H處理。從Handler H對(duì)LAUNCH_ACTIVITY這個(gè)方法的處理可以知道,Activity的啟動(dòng)過(guò)程由ActivityThread的handleLaunchActivity方法實(shí)現(xiàn),在方法中調(diào)用了performLaunchactivity方法最終完成了Activity對(duì)象的創(chuàng)建和啟動(dòng)過(guò)程,并且ActivityThread通過(guò)handleResumeActivity方法來(lái)調(diào)用被啟動(dòng)的Activity的onresume
這一生命周期方法
performLaunchActivity這個(gè)方法主要完成了如下幾件事
1.從ActivityClientRecord中獲取待啟動(dòng)的Activity的組件信息
2.通過(guò)Instrumentation的newActivity方法使用類加載器創(chuàng)建Activity類
3.通過(guò)LoadedApk的makeApplication方法嘗試創(chuàng)建application對(duì)象
4.創(chuàng)建ContextImpl對(duì)象并通過(guò)Activity的attach方法來(lái)完成一些重要數(shù)據(jù)的初始化
5.調(diào)用Activity的oncreate方法
9.3Service工作原理
啟動(dòng)Service startService(new Intent(this,MyService.class))
Service的啟動(dòng)過(guò)程從ContextWrapper的startService開(kāi)始。方法中調(diào)用了mBase.startService。mBase類型是ContextImpl。在ContextImpl的startService中,調(diào)用了startServiceCommon方法。而startServceCommon方法又通過(guò)ActivitymanagerNative.getDefault().startService這個(gè)對(duì)象來(lái)啟動(dòng)一個(gè)服務(wù)。方法中調(diào)用了(ActiveServices)mServices.startServiceLocked,此方法中有調(diào)用的startServiceInnnerLocked。此方法又調(diào)用了bringupServiceLocked,此方法中調(diào)用了realStartServiceLocked。此方法中調(diào)用了app.thread的scheduleCreateService方法來(lái)創(chuàng)建service對(duì)象并調(diào)用其onCreate方法。接著通過(guò)sendServiceArgsLocked方法來(lái)調(diào)用Service的其他方法,比如onStartCommand,這兩個(gè)過(guò)程均是進(jìn)程間通信。ApplicationThread中對(duì)Service啟動(dòng)過(guò)程的處理對(duì)應(yīng)他的scheduleCreateService方法。方法中發(fā)送消息給Handler H來(lái)完成,H接受到這個(gè)CREATE_SERVICE消息并通過(guò)ActivityThread的handleCreateService方法來(lái)完成Service的最終啟動(dòng)
handleCreateService主要完成了如下幾個(gè)方法
1.首先通過(guò)類加載器創(chuàng)建Service的實(shí)例
2.然后創(chuàng)建Application對(duì)象并調(diào)用其onCreate,當(dāng)然Application的創(chuàng)建過(guò)程只會(huì)有一次
3.接著創(chuàng)建ContextImpl對(duì)象并通過(guò)Service的attach方法建立二者的關(guān)系
4.最后調(diào)用Service的onCreate方法并將Service方法存儲(chǔ)在ActivityThread中的一個(gè)列表中
此外,ActivityThread還會(huì)通過(guò)handleServiceArgs方法調(diào)用Service的onStartCommand方法
9.4broadcastReceiver的工作過(guò)程
動(dòng)態(tài)注冊(cè)過(guò)程 ContextWrapper類的registerReciiver 然后是ConextImpl的registerReceiver方法調(diào)用了registerReceiverInternal.然后系統(tǒng)mPackageInfo獲取IIntentReceiver對(duì)象,然后用跨進(jìn)程的方式向AMS發(fā)送廣播的注冊(cè)請(qǐng)求。AMS中registerReceiver方法把InnerReceiver對(duì)象以及IntentFilter對(duì)象存儲(chǔ)起來(lái),這樣廣播就注冊(cè)完成了。
廣播的發(fā)送和接受
首先ContextWrapper的sendBroadcaset方法。然后調(diào)用contextImpl的sendBroadCast,向AMS調(diào)用broadcastIntent。然后調(diào)用broadcastintentLocked方法在方法內(nèi)部根據(jù)intent- filter查找匹配的廣播接受者,將滿足條件的接受者添加到broadcastqueue。
9.5ContentProvider的工作過(guò)程
應(yīng)用啟動(dòng)的時(shí)候,入口方法為ActivityThread的main方法,main是一個(gè)靜態(tài)方法,在main方法中會(huì)創(chuàng)建ActivityThread的實(shí)例并創(chuàng)建主線程的消息隊(duì)列
然后在activityThread的attach方法中遠(yuǎn)程調(diào)用AMS的attachApplication方法并將ApplicationThread對(duì)象提供給AMS。他主要作用于ActivityThread和AMS之間的通信。在AMS的attachApplication中會(huì)調(diào)用ApplicationThread的bindApplication方法。bindApplication會(huì)經(jīng)過(guò)ActivityThread中的mH handler切換到ActivityThread中去,具體方法是handleBinderApplication。在方法中ActivityThread會(huì)創(chuàng)建Application對(duì)象并加載ContentProvider