BroadCastReciver 源码分析
上篇记录了activity启动流程的关键节点代码,本篇同样只是记录广播源码的关键节点代码
一、发送广播
broadCast 分为普通广播和有序广播,普通广播 发送后注册该广播的接收器都能接收到,而有序广播不同的是会根据接收器的优先级依次收到广播,并可中断广播继续向下发送
以下做了一个简单的脑图,做为流程图,可以大体看明白广播的传递流程
关键节点源码
sendBroadCast只是在Context中做了定义,而Context的实现类是Contextimpl,以下代码我们可以看到是直接将参数给到了AMS处理
@Override
public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
warnIfCallingFromSystemProcess();
String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
String[] receiverPermissions = receiverPermission == null ? null
: new String[] {
receiverPermission};
try {
intent.prepareToLeaveProcess(this);
//调用AMS
ActivityManager.getService().broadcastIntent(
mMainThread.getApplicationThread(), intent, resolvedType, null,
Activity.RESULT_OK, null, null, receiverPermissions, appOp, null, false, false,
getUserId());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
通过层层调用我们在方法broadcastIntentLocked中会看到以下关键代码:
其中 queue.enqueueParallelBroadcastLocked的实现,将该条记录存放到了列表中
public void enqueueParallelBroadcastLocked(BroadcastRecord r) {
this.mParallelBroadcasts.add(r);
}
scheduleBroadcastsLocked的实现,这里通过handler发送了一个消息
public void scheduleBroadcastsLocked() {
if (!this