parent
b6fec7d9b9
commit
dea21c9edb
@ -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<BroadcastReceiver, ReceiverDispatcher> 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<ReceiverDispatcher> mDispatcher; |
||||||
|
InnerReceiver(ReceiverDispatcher rd, boolean strong) { |
||||||
|
mDispatcher = new WeakReference<ReceiverDispatcher>(fd); |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
引用链: |
||||||
|
|
||||||
|
AMS -> IIntentReceiver -> ReceiverDispatcher -> BroadcastReceiver |
||||||
|
|
||||||
|
AMS 是如何处理注册广播的? |
||||||
|
|
||||||
|
```java |
||||||
|
// AMS#registerReceiver |
||||||
|
public Intent registerReceiver(IApplicationThread caller, ...) { |
||||||
|
// ReceiverList: List<BroadcastFilter> |
||||||
|
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<N;i++){ |
||||||
|
BroadcastFilter target = r.receivers.get(i); |
||||||
|
deliverToRegisterReceiverLocked(r, target, false); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
#### 广播的接收 |
||||||
|
|
||||||
|
```java |
||||||
|
void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, ...) { |
||||||
|
if(app != null){ |
||||||
|
app.thread.scheduleRegisterReceiver(receiver, intent, ...); |
||||||
|
} else { |
||||||
|
receiver.performReceiver(intent, resultCode, data, ...); |
||||||
|
} |
||||||
|
} |
||||||
|
void scheduleRegisterReceiver(IIntentReceiver receiver, Intent intent, ...) { |
||||||
|
receiver.performReceiver(intent, resultCode, dataStr, ...); |
||||||
|
} |
||||||
|
public void performReceiver(Intent intent, int resultCode, String data, ...) { |
||||||
|
ReceiverDispatcher rd = mDispatcher.get(); |
||||||
|
rd.performReceive(intent, resultCode, data, extras, ...); |
||||||
|
} |
||||||
|
public void performReceive(Intent intent, int resultCode, ...) { |
||||||
|
Args args = new Args(intent, resultCode, data, ...); |
||||||
|
mActivityThread.post(args); |
||||||
|
} |
||||||
|
// ReceiverDispatcher 的内部类 |
||||||
|
class Args implements Runnable { |
||||||
|
public void run() { |
||||||
|
final BoradcastReceiver receiver = mReceiver; |
||||||
|
receiver.setPendingResult(this); |
||||||
|
receiver.onReceive(mContext, intent); |
||||||
|
if(receiver.getPendingResult()!=null){ |
||||||
|
finish(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
public final void finish(){ |
||||||
|
// 静态广播 |
||||||
|
if(mType == TYPE_COMPONENT) { |
||||||
|
final IActivityManager mgr = ActivityManagerNative.getDefault(); |
||||||
|
if(QueuedWork.hasPendingwork()) { |
||||||
|
QueuedWork.singleThreadExecutor().execute(new Runnable(){ |
||||||
|
public void run(){ |
||||||
|
sendFinished(mgr); |
||||||
|
} |
||||||
|
}) |
||||||
|
}else{ |
||||||
|
sendFinished(mgr); |
||||||
|
} |
||||||
|
}else if(mOrderedHint && mType!=TYPE_UNREGISTERED){ |
||||||
|
IActivityManager mgr = ActivityManagerNative.getDefault(); |
||||||
|
sendFinished(mgr); |
||||||
|
} |
||||||
|
// 动态广播什么都没做 |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
#### 总结 |
||||||
|
|
||||||
|
1. 注册广播封装了一个 binder 对象到 AMS |
||||||
|
2. 通过广播 intent 找到匹配的 receiver,然后分发 |
||||||
|
3. 普通动态广播在系统端是并行分发,应用端串行分发 |
||||||
|
|
Loading…
Reference in new issue