9.1 四大組件的運(yùn)行狀態(tài)
- Activity用于向用戶(hù)展示界面,可由顯式或者隱式Intent來(lái)啟動(dòng)裂问。
- Service用于在后臺(tái)執(zhí)行計(jì)算任務(wù)侧啼,運(yùn)行在主線程中的,耗時(shí)的后臺(tái)計(jì)算仍然需要在單獨(dú)的線程中去完成堪簿。Service組件有兩種狀態(tài):
- 啟動(dòng)狀態(tài):不可與外界通信(當(dāng)然有可以通過(guò)廣播發(fā)送Intent)
- 綁定狀態(tài)痊乾。外界可以很方便的和service進(jìn)行通信
- BroadcastReceiver是一種消息型組件,用于在不同的組件乃至不同的應(yīng)用之間傳遞消息椭更,它工作在系統(tǒng)內(nèi)部哪审。廣播有兩種注冊(cè)方式:
- 靜態(tài)注冊(cè): AndroidManifest中注冊(cè),在應(yīng)用安裝的時(shí)候會(huì)被系統(tǒng)解析虑瀑,這種廣播不需要應(yīng)用啟動(dòng)就可以收到相應(yīng)的廣播湿滓。
- 動(dòng)態(tài)注冊(cè)。動(dòng)態(tài)注冊(cè)需要通過(guò)Context.registerReceiver()來(lái)注冊(cè)舌狗,這種廣播需要應(yīng)用啟動(dòng)才能注冊(cè)并接收廣播叽奥。
- ContentProvider用于向其他組件乃至其他應(yīng)用共享數(shù)據(jù)。ContentProvider中的insert痛侍、delete朝氓、update、query方法需要處理好線程同步,因?yàn)檫@幾個(gè)方法是在Binder線程池中被調(diào)用的
9.2 Activity的工作過(guò)程
-
Activity啟動(dòng)的大致流程(從前一個(gè)Activity中的startActivity到新的Activity即將建立)
- ApplicationThread是ActivityThread的一個(gè)內(nèi)部類(lèi)赵哲,它繼承自ApplicationThreadNative待德,而ApplicationThreadNative繼承自Binder并實(shí)現(xiàn)了IApplicationThread接口,ApplicationThreadNative的作用其實(shí)就和系統(tǒng)為AIDL文件生成的類(lèi)是一樣的枫夺。
- ActivityManagerService(AMS)繼承自ActivityManagerNative将宪,而ActivityManagerNative繼承自Binder并實(shí)現(xiàn)了IActivityManager這個(gè)Binder接口,因此AMS也是一個(gè)Binder筷屡。
- 一個(gè)應(yīng)用只有一個(gè)Application對(duì)象涧偷,它的創(chuàng)建也是通過(guò)Instrumentation來(lái)完成的,這個(gè)過(guò)程和Activity對(duì)象的創(chuàng)建過(guò)程一樣毙死,都是通過(guò)類(lèi)加載器來(lái)實(shí)現(xiàn)的燎潮。
- 在performLaunchActivity這個(gè)方法中,完成了5件事情
- 獲取待啟動(dòng)的Activity
- Instrumentation.newActivity()
- makeApplication
- 創(chuàng)建ContextImpl對(duì)象并通過(guò)Activity的attach方法完成重要數(shù)據(jù)初始化扼倘。attach方法中确封,Activity還會(huì)完成Window的創(chuàng)建并建立自己和Window的關(guān)聯(lián)。
- 調(diào)用Activity的onCreate方法
總結(jié):
AMS是system_server提供的一個(gè)管理四大組件的重要服務(wù)再菊,StartActivity是一個(gè)典型的Binder請(qǐng)求過(guò)程爪喘,ActivityThread是一個(gè)應(yīng)用進(jìn)程的主線程。
- Activity對(duì)象作為客戶(hù)端通過(guò)ActivityManagerNative向system_server的AMS發(fā)起startActvity的Binder請(qǐng)求
- 服務(wù)端的AMS調(diào)用一系列的方法(主要Activity棧的操作纠拔,詳細(xì)的邏輯也和LauncherMode有關(guān))秉剑,然后通過(guò)客戶(hù)端(ActivityThread)的Binder——ApplicationThread,讓ActivityThread作出performLaunchActivity的操作
- ActivityThread->AMS->ActivityThread稠诲。如果startActivity的目標(biāo)是進(jìn)程內(nèi)侦鹏,則前后的ActivityThread是同一個(gè);如果startActvity的目標(biāo)是進(jìn)程外臀叙,則前后的ActvityThread是不同的略水。
9.3 Service的工作過(guò)程
-
startServie
-
bindServie
- 同Activity,startService/bindService也是一個(gè)ActivityThread->AMS->ActivityThread的Binder過(guò)程
9.4 BroadcastReceiver的工作過(guò)程
- BroadcastReceiver的工作過(guò)程包括廣播注冊(cè)過(guò)程劝萤、廣播發(fā)送和接收過(guò)程渊涝。
- 注冊(cè)過(guò)程
-
動(dòng)態(tài)注冊(cè)
動(dòng)態(tài)注冊(cè)的原理是將Receiver打包成可傳輸?shù)腎IntentReceiver,跨進(jìn)程向AMS發(fā)送注冊(cè)請(qǐng)求床嫌,然后AMS中保存(InnerReceiver和filter)下來(lái)即可跨释。
- 靜態(tài)注冊(cè)
四大組件在應(yīng)用安裝是會(huì)由PMS解析并注冊(cè),靜態(tài)注冊(cè)的廣播也是這時(shí)候注冊(cè)的厌处。
-
-
發(fā)送和接收過(guò)程
- 廣播的發(fā)送有幾種類(lèi)型:
- 普通廣播
- 有序廣播:按優(yōu)先級(jí)的不同煤傍,優(yōu)先Receiver可對(duì)數(shù)據(jù)進(jìn)行處理,并傳給下一個(gè)Receiver嘱蛋。
- 5.0后蚯姆,默認(rèn)情況下廣播不會(huì)發(fā)送給已經(jīng)停止的應(yīng)用
9.5 ContentProvider的工作過(guò)程
- ContentProvider的啟動(dòng)過(guò)程伴隨著Application的啟動(dòng)過(guò)程:
- 當(dāng)一個(gè)應(yīng)用啟動(dòng)時(shí)五续,入口方法是ActivityThread的main方法,其中創(chuàng)建ActivityThread的實(shí)例并創(chuàng)建主線程的消息隊(duì)列龄恋;
- ActivityThread的attach方法中會(huì)遠(yuǎn)程調(diào)用ActivityManagerService的attachApplication疙驾,并將ApplicationThread提供給AMS,ApplicationThread主要用于ActivityThread和AMS之間的通信郭毕;
- ActivityManagerService的attachApplication會(huì)調(diào)用ApplicationThread的bindApplication方法它碎,這個(gè)方法會(huì)通過(guò)H切換到ActivityThread中去執(zhí)行,即調(diào)用handleBindApplication方法显押;
4.handleBindApplication方法會(huì)創(chuàng)建Application對(duì)象并加載ContentProvider扳肛,注意是先加載ContentProvider,然后調(diào)用Application的onCreate方法乘碑。
- ContentProvider的android:multiprocess屬性決定它是否是單實(shí)例挖息,默認(rèn)值是false,也就是默認(rèn)是單實(shí)例兽肤。當(dāng)設(shè)置為true時(shí)套腹,每個(gè)調(diào)用者的進(jìn)程中都存在一個(gè)ContentProvider對(duì)象。
- 當(dāng)調(diào)用ContentProvider的insert资铡、delete电禀、update、query方法中的任何一個(gè)時(shí)笤休,如果ContentProvider所在的進(jìn)程沒(méi)有啟動(dòng)的話(huà)尖飞,那么就會(huì)觸發(fā)ContentProvider的創(chuàng)建,并伴隨著ContentProvider所在進(jìn)程的啟動(dòng)店雅。
-
ContentProvider query的流程