9.2 Activity的工作過程
啟動一個activity导盅,顯示狀態(tài)下洋侨,可以用過startActivity(new Intent(this,TextActivity.class))
startActivity方法有好幾種重載的方法指厌,但是他們最終會調(diào)用startActivityForResult方法岖妄。在這個方法中調(diào)用了Instrumentation的execStartActivity.在這個方法中鹉勒,ActivityManagerNative.getDefault().startActivity方法實現(xiàn)迹栓。ActivityManagerService繼承自ActivityManagerNative,而ActivityManagerNative繼承自Binder并實現(xiàn)了IActivitymanager這個Binder接口僧免。ActivityManagerNative具體實現(xiàn)是ActivityManagerService(AMS)刑赶。 在ActivityManagerNative中,AMS這個Binder對象采用單例模式對外提供懂衩,Singleton是一個單例的封裝類撞叨。第一次調(diào)用他的get方法他會通過create方法來初始化AMS這個Binder對象。在后續(xù)的調(diào)用中則直接返回之前創(chuàng)建的對象浊洞。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實現(xiàn)者是ActivityThread中的內(nèi)部類ApplicationThread屋剑。ApplicationThread繼承了ApplicationThreadNative润匙,而ApplicationThreadNative則繼承了Binder并實現(xiàn)了IApplicationThread類。繞了一大圈Activity的啟動過程最終回到了ApplicationThread中scheduleLaunchActivity來啟動Activity唉匾,在ApplicationThread中schedulelaunchActivity實現(xiàn)很簡單孕讳,就是發(fā)送了一個啟動Activity的消息交由handler處理,這個Handler有一個簡潔的名字H肄鸽,sendMessage的作用就是發(fā)送一個消息給H處理卫病。從Handler H對LAUNCH_ACTIVITY這個方法的處理可以知道,Activity的啟動過程由ActivityThread的handleLaunchActivity方法實現(xiàn)典徘,在方法中調(diào)用了performLaunchactivity方法最終完成了Activity對象的創(chuàng)建和啟動過程,并且ActivityThread通過handleResumeActivity方法來調(diào)用被啟動的Activity的onresume
這一生命周期方法
performLaunchActivity這個方法主要完成了如下幾件事
1.從ActivityClientRecord中獲取待啟動的Activity的組件信息
2.通過Instrumentation的newActivity方法使用類加載器創(chuàng)建Activity類
3.通過LoadedApk的makeApplication方法嘗試創(chuàng)建application對象
4.創(chuàng)建ContextImpl對象并通過Activity的attach方法來完成一些重要數(shù)據(jù)的初始化
5.調(diào)用Activity的oncreate方法
9.3Service工作原理
啟動Service startService(new Intent(this,MyService.class))
Service的啟動過程從ContextWrapper的startService開始益咬。方法中調(diào)用了mBase.startService逮诲。mBase類型是ContextImpl帜平。在ContextImpl的startService中,調(diào)用了startServiceCommon方法梅鹦。而startServceCommon方法又通過ActivitymanagerNative.getDefault().startService這個對象來啟動一個服務(wù)裆甩。方法中調(diào)用了(ActiveServices)mServices.startServiceLocked,此方法中有調(diào)用的startServiceInnnerLocked。此方法又調(diào)用了bringupServiceLocked齐唆,此方法中調(diào)用了realStartServiceLocked嗤栓。此方法中調(diào)用了app.thread的scheduleCreateService方法來創(chuàng)建service對象并調(diào)用其onCreate方法。接著通過sendServiceArgsLocked方法來調(diào)用Service的其他方法箍邮,比如onStartCommand茉帅,這兩個過程均是進(jìn)程間通信。ApplicationThread中對Service啟動過程的處理對應(yīng)他的scheduleCreateService方法锭弊。方法中發(fā)送消息給Handler H來完成堪澎,H接受到這個CREATE_SERVICE消息并通過ActivityThread的handleCreateService方法來完成Service的最終啟動
handleCreateService主要完成了如下幾個方法
1.首先通過類加載器創(chuàng)建Service的實例
2.然后創(chuàng)建Application對象并調(diào)用其onCreate,當(dāng)然Application的創(chuàng)建過程只會有一次
3.接著創(chuàng)建ContextImpl對象并通過Service的attach方法建立二者的關(guān)系
4.最后調(diào)用Service的onCreate方法并將Service方法存儲在ActivityThread中的一個列表中
此外味滞,ActivityThread還會通過handleServiceArgs方法調(diào)用Service的onStartCommand方法
9.4broadcastReceiver的工作過程
動態(tài)注冊過程 ContextWrapper類的registerReciiver 然后是ConextImpl的registerReceiver方法調(diào)用了registerReceiverInternal.然后系統(tǒng)mPackageInfo獲取IIntentReceiver對象樱蛤,然后用跨進(jìn)程的方式向AMS發(fā)送廣播的注冊請求。AMS中registerReceiver方法把InnerReceiver對象以及IntentFilter對象存儲起來剑鞍,這樣廣播就注冊完成了昨凡。
廣播的發(fā)送和接受
首先ContextWrapper的sendBroadcaset方法。然后調(diào)用contextImpl的sendBroadCast蚁署,向AMS調(diào)用broadcastIntent便脊。然后調(diào)用broadcastintentLocked方法在方法內(nèi)部根據(jù)intent- filter查找匹配的廣播接受者,將滿足條件的接受者添加到broadcastqueue形用。
9.5ContentProvider的工作過程
應(yīng)用啟動的時候就轧,入口方法為ActivityThread的main方法,main是一個靜態(tài)方法田度,在main方法中會創(chuàng)建ActivityThread的實例并創(chuàng)建主線程的消息隊列
然后在activityThread的attach方法中遠(yuǎn)程調(diào)用AMS的attachApplication方法并將ApplicationThread對象提供給AMS妒御。他主要作用于ActivityThread和AMS之間的通信。在AMS的attachApplication中會調(diào)用ApplicationThread的bindApplication方法镇饺。bindApplication會經(jīng)過ActivityThread中的mH handler切換到ActivityThread中去乎莉,具體方法是handleBinderApplication。在方法中ActivityThread會創(chuàng)建Application對象并加載ContentProvider