一、Activity啟動(dòng)過(guò)程

應(yīng)用冷啟動(dòng)過(guò)程:
- Launcher進(jìn)程通過(guò)Binder機(jī)制通知AMS創(chuàng)建應(yīng)用
- AMS判斷當(dāng)前應(yīng)用是否啟動(dòng),沒(méi)有啟動(dòng)通過(guò)Socket通訊通知Zygote進(jìn)程fork應(yīng)用進(jìn)程
- AMS通過(guò)Binder機(jī)制請(qǐng)求ApplicationThread創(chuàng)建并啟動(dòng)根Activity
- ApplicationThread通過(guò)Handle機(jī)制通知主線(xiàn)程ActivityThread,最終調(diào)用到根Activity的onCreat方法
應(yīng)用熱啟動(dòng)過(guò)程:
- Launcher進(jìn)程通過(guò)Socket通訊通知AMS創(chuàng)建應(yīng)用
- AMS判斷當(dāng)前應(yīng)用是否啟動(dòng),已經(jīng)啟動(dòng)則無(wú)需再次創(chuàng)建App進(jìn)程
- AMS通過(guò)Binder機(jī)制請(qǐng)求ApplicationThread創(chuàng)建并啟動(dòng)根Activity
- ApplicationThread通過(guò)Handle機(jī)制通知主線(xiàn)程ActivityThread,最終調(diào)用到根Activity的onCreat方法
二、Service的啟動(dòng)過(guò)程
Service的啟動(dòng)流程和Activity類(lèi)似,以下是Service的大致啟動(dòng)流程

三、Service的綁定流程
Serice的綁定流程比startService的流程稍微要復(fù)雜一點(diǎn),大概的時(shí)序圖可以分為下面3個(gè)部分
1、Client發(fā)起bindService調(diào)起AMS的過(guò)程

2、AMS通知App進(jìn)程發(fā)起綁定Service的過(guò)程

3、Service實(shí)際綁定的過(guò)程

四、廣播的注冊(cè)、發(fā)送和接收
1、廣播的注冊(cè)過(guò)程

- 動(dòng)態(tài)注冊(cè)的過(guò)程是從ContextWrapper#registerReceiver()開(kāi)始的. 和Activity或者Service一樣. ContextWrapper并沒(méi)有做實(shí)際的工作, 而是將注冊(cè)的過(guò)程直接交給了ContextImpl來(lái)完成。
- ContextImpl#registerReceiver()方法調(diào)用了本類(lèi)的registerReceiverInternal()方法。
- 系統(tǒng)首先從mPackageInfo獲取到IIntentReceiver對(duì)象, 然后再采用跨進(jìn)程的方式向AMS發(fā)送廣播注冊(cè)的請(qǐng)求. 之所以采用IIntentReceiver而不是直接采用BroadcastReceiver, 這是因?yàn)樯鲜鲎?cè)過(guò)程中是一個(gè)進(jìn)程間通信的過(guò)程. 而B(niǎo)roadcastReceiver作為Android中的一個(gè)組件是不能直接跨進(jìn)程傳遞的. 所有需要通過(guò)IIntentReceiver來(lái)中轉(zhuǎn)一下。
- IIntentReceiver作為一個(gè)Binder接口, 它的具體實(shí)現(xiàn)是LoadedApk.ReceiverDispatcher.InnerReceiver, ReceiverDispatcher的內(nèi)部同時(shí)保存了BroadcastReceiver和InnerReceiver, 這樣當(dāng)接收到廣播的時(shí)候, ReceiverDispatcher可以很方便的調(diào)用BroadcastReceiver#onReceive()方法. 這里和Service很像有同樣的類(lèi), 并且內(nèi)部類(lèi)中同樣也是一個(gè)Binder接口。
- 由于注冊(cè)廣播真正實(shí)現(xiàn)過(guò)程是在AMS中, 因此跟進(jìn)AMS中, 首先看registerReceiver()方法, 這里只關(guān)心里面的核心部分. 這段代碼最終會(huì)把遠(yuǎn)程的InnerReceiver對(duì)象以及IntentFilter對(duì)象存儲(chǔ)起來(lái), 這樣整個(gè)廣播的注冊(cè)就完成了。
2、廣播的發(fā)送和接收

廣播的發(fā)送有幾種:普通廣播、有序廣播和粘性廣播,他們的發(fā)送/接收流程是類(lèi)似的,因此只分析普通廣播的實(shí)現(xiàn)。
1.廣播的發(fā)送和接收, 本質(zhì)就是一個(gè)過(guò)程的兩個(gè)階段. 廣播的發(fā)送仍然開(kāi)始于ContextImpl#sendBroadcase()方法, 之所以不是Context, 那是因?yàn)镃ontext#sendBroad()是一個(gè)抽象方法. 和廣播的注冊(cè)過(guò)程一樣, ContextWrapper#sendBroadcast()仍然什么都不做, 只是把事情交給了ContextImpl去處理。
2.ContextImpl里面也幾乎什么都沒(méi)有做, 內(nèi)部直接向AMS發(fā)起了一個(gè)異步請(qǐng)求用于發(fā)送廣播。
3.調(diào)用AMS#broadcastIntent()方法,繼續(xù)調(diào)用broadcastIntentLocked()方法。
4.在broadcastIntentLocked()內(nèi)部, 會(huì)根據(jù)intent-filter查找出匹配的廣播接收者并經(jīng)過(guò)一系列的條件過(guò)濾. 最終會(huì)將滿(mǎn)足條件的廣播接收者添加到BroadcastQueue中, 接著B(niǎo)roadcastQueue就會(huì)將廣播發(fā)送給相應(yīng)廣播接收者。
5.BroadcastQueue#scheduleBroadcastsLocked()方法內(nèi)并沒(méi)有立即發(fā)送廣播, 而是發(fā)送了一個(gè)BROADCAST_INTENT_MSG類(lèi)型的消息, BroadcastQueue收到消息后會(huì)調(diào)用processNextBroadcast()方法。
6.無(wú)序廣播存儲(chǔ)在mParallelBroadcasts中, 系統(tǒng)會(huì)遍歷這個(gè)集合并將其中的廣播發(fā)送給他們所有的接收者, 具體的發(fā)送過(guò)程是通過(guò)deliverToRegisteredReceiverLocked()方法實(shí)現(xiàn)。deliverToRegisteredReceiverLocked()負(fù)責(zé)將一個(gè)廣播發(fā)送給一個(gè)特定的接收者, 它的內(nèi)部調(diào)用了performReceiverLocked方法來(lái)完成具體發(fā)送過(guò)程。
7.performReceiverLocked()方法調(diào)用的ApplicationThread#scheduleRegisteredReceiver()實(shí)現(xiàn)比較簡(jiǎn)單, 它通過(guò)InnerReceiver來(lái)實(shí)現(xiàn)廣播的接收。
8.scheduleRegisteredReceiver()方法中,receiver.performReceive()中的receiver對(duì)應(yīng)著IIntentReceiver類(lèi)型的接口. 而具體的實(shí)現(xiàn)就是ReceiverDispatcher#InnerReceiver. 這兩個(gè)嵌套的內(nèi)部類(lèi)是所屬在LoadedApk中的。
9.又調(diào)用了LoadedApk$ReceiverDispatcher#performReceive()的方法.在performReceiver()這個(gè)方法中, 會(huì)創(chuàng)建一個(gè)Args對(duì)象并通過(guò)mActivityThread的post方法執(zhí)行args中的邏輯. 而這些類(lèi)的本質(zhì)關(guān)系就是:
- Args: 實(shí)現(xiàn)類(lèi)Runnable。
- mActivityThread: 是一個(gè)Handler, 就是ActivityThread中的mH. mH就是ActivityThread$H. 這個(gè)內(nèi)部類(lèi)H以前說(shuō)過(guò)。
10.實(shí)現(xiàn)Runnable接口的Args中BroadcastReceiver#onReceive()方法被執(zhí)行了, 也就是說(shuō)應(yīng)用已經(jīng)接收到了廣播, 同時(shí)onReceive()方法是在廣播接收者的主線(xiàn)程中被調(diào)用的。
五、ContentProvider的啟動(dòng)過(guò)程
ContentProvider的啟動(dòng)過(guò)程和其他3大組件基本類(lèi)似,都是通過(guò)AMS實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)共享,這里主要列舉一下ContentResolver里的query方法到AMS的過(guò)程和AMS啟動(dòng)ContentProvider的過(guò)程
1、ContentResolver里的query方法到AMS的過(guò)程

2、AMS啟動(dòng)ContentProvider的過(guò)程
