From dea21c9edb1771aec2ba2ccad3c745666794f6ce Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 24 Mar 2020 19:15:30 +0800 Subject: [PATCH] =?UTF-8?q?Create=20=E5=8A=A8=E6=80=81=E5=B9=BF=E6=92=AD?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E5=86=8C=E5=92=8C=E6=94=B6=E5=8F=91=E5=8E=9F?= =?UTF-8?q?=E7=90=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../动态广播的注册和收发原理.md | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 blogs/Android/Framework/Interview/其他应用组件相关/动态广播的注册和收发原理.md diff --git a/blogs/Android/Framework/Interview/其他应用组件相关/动态广播的注册和收发原理.md b/blogs/Android/Framework/Interview/其他应用组件相关/动态广播的注册和收发原理.md new file mode 100644 index 0000000..4bae79d --- /dev/null +++ b/blogs/Android/Framework/Interview/其他应用组件相关/动态广播的注册和收发原理.md @@ -0,0 +1,161 @@ +--- +动态广播的注册和收发原理 +--- + +1. 动态广播的注册原理 +2. 广播的发送原理 +3. 广播的接收原理 + +#### 广播的注册 + +```java +@Override +public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { + return registerReceiver(receiver, filter, null, null); +} +``` + +```java +Intent registerReceiverInternal(BroadcastReceiver receiver, ...) { + IIntentReceiver rd = null; + schedule = mMainThread.getHandler(); + rd = mPackageInfo.getReceiverDispatcher(receiver, context, schedule, ...); + return ActivityManagerNative.getDefault().registerReceiver(rd, filter, ...); +} +IIntentReceiver getReceiverDispatcher(BroadcastReceiver r, ...) { + ReceiverDispatcher rd = null; + ArrayMap map = null; + map = mReceivers.get(context); + rd = new ReceiverDispatcher(r, context, handler, ...); + map.put(r, rd); + return rd.getIIntentReceiver(); +} +ReceiverDispatcher(BroadcastReceiver receiver, Context context, ...) { + mIIntentReceiver = new InnerReceiver(this, !registered); + mReceiver = receiver; +} +final static class InnerReceiver extends IIntentReceiver.Stub { + final WeakReference mDispatcher; + InnerReceiver(ReceiverDispatcher rd, boolean strong) { + mDispatcher = new WeakReference(fd); + } +} +``` + +引用链: + +AMS -> IIntentReceiver -> ReceiverDispatcher -> BroadcastReceiver + +AMS 是如何处理注册广播的? + +```java +// AMS#registerReceiver +public Intent registerReceiver(IApplicationThread caller, ...) { + // ReceiverList: List + ReceiverList rl = nRigisterReceiver.get(receiver.asBinder()); + if(rl == null){ + rl = new ReceiverList(receiver, ...); + rl.app.receiver.add(rl); + mRegisterReceivers.put(receiver.asBinder(), rl); + } + BroadcastFilter bf = new BroadcastReceiver(filter, rl, ...); + rl.add(bf); + mReceiverResolver.addFilter(bf); +} +``` + +#### 广播的发送 + +```java +@Override +public void sendBroadcast(Intent intent) { + ActivityManagerNative.getDrfault().broadcastIntent(mMainThread.getApplicationThread(), intent, ...); +} +int broadcastIntent(IApplicationThread caller, Intent intent, ...) { + broadcastIntentLocked(callerApp, ...); +} +int broadcastIntentLocked(ProcessRecord callerApp, ...) { + registerReceivers = mReceiverResolver.queryIntent(intent, ...); + int NR = registedReceivers.size(); + if(!ordered && NR > 0){ + final BroadcastQueue queue = broadcastQueueForIntent(intent); + BroadcastRecord r = new BroadcastRecord(queue, intent, registeredReceivers, ...); + queue.enqueueParallelBroadcastLocked(r); + queue.scheduleBroadcastsLocked(); + registeredReceivers = null; + NR = 0; + } +} +// 处理广播分发的函数 +final void processNextBroadcast(boolean fromMsg) { + BroadcastRecord r; + while(mParallelBroadcasts.size()>0){ + r = mParallelBroadcasts.remove(0); + final int N = r.receivers.size(); + for(int i=0;i