廣播如何注冊(cè)如叼,廣播如何執(zhí)行receiver方法的
我們普通的廣播發(fā)送
最后調(diào)用的是
其中IItentReceiver是個(gè)aidl類秘蛔,這個(gè)方法目的就是獲取到rd凌箕,然后調(diào)用AMS的registerReceiver注冊(cè)方法枪萄。
mRegisteredReceivers是一個(gè)final HashMap<IBinder,ReceiverList>?mRegisteredReceivers =new HashMap<>(); key就是我們上面的IIntentReceiver伶选,Value是ReceiverList史飞。接下來(lái)我們看看這個(gè)類
這里面有ProcrssRecord進(jìn)程的描述,pid:進(jìn)程id仰税,uid:用戶id
一個(gè)APP進(jìn)程有可能注冊(cè)多個(gè)廣播构资。
發(fā)送廣播的過(guò)程其實(shí)就在將receiver保存到系統(tǒng)進(jìn)程AMS的一個(gè)mRegistedReceivers(HashMap數(shù)據(jù)結(jié)構(gòu))中。
下面我們來(lái)分析發(fā)送廣播:
從發(fā)送最簡(jiǎn)單最普通廣播主要分析整個(gè)流程
將廣播入隊(duì)列(數(shù)據(jù)結(jié)構(gòu)不是隊(duì)列)和MessageQueue內(nèi)部維護(hù)了一個(gè)數(shù)組而已陨簇。通過(guò)Handler發(fā)送一個(gè)BROADCAST_INTENT_MSG消息
最后看到這里就是回調(diào)了receiver的方法吐绵,這樣整個(gè)接收廣播的大概流程就走完了。