【Android源码分析】Broadcast发送流程

在这里插入图片描述Android 10

发送广播

涉及到的文件

android/frameworks/base/core/java/android/app/ContextImpl.java
android/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

代码是简单的调用逻辑
在这里插入图片描述

广播打包

涉及到的文件

android/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

在这里插入图片描述
相关函数

final int broadcastIntentLocked(ProcessRecord callerApp,
            String callerPackage, Intent intent, String resolvedType,
            IIntentReceiver resultTo, int resultCode, String resultData,
            Bundle resultExtras, String[] requiredPermissions, int appOp, Bundle bOptions,
            boolean ordered, boolean sticky, int callingPid, int callingUid, int userId){ ... }

由于代码太多就不贴了,这个函数主要的功能是,找到参数intent所描述广播的目标广播接收者,并将它们按照是否有序分别保存到mParallelBroadcasts和mOrderedBroadcasts队列中
ps:
无序广播调度队列mParallelBroadcasts(包括动态注册的无序广播接收者)
有序广播调度队列mOrderedBroadcasts(包括动态注册的有序广播接收者和所有静态注册的广播接收者)
当把广播打包成两个队列后,就把它们调到BroadcastQueue类中进行处理

寻找广播接收者

涉及到的文件

android/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java

在这里插入图片描述相关函数

//标记是否已经向消息队列发送了一个类型为BROADCAST_INTENT_MSG消息
public void scheduleBroadcastsLocked();
/**
 *将广播转发给各目标广播接收者处理
 *将mParallelBroadcasts队列中的广播直接发送给它的接收者处理
 *mOrderedBroadcasts队列中动态注册的有序广播直接发送给它的接收者处理
 *mOrderedBroadcasts队列中的静态注册的广播接收者,判断权限,若程序没有启动先启动,然 *后再发送给它的接收者处理
 */
final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj);

分发广播到接收者

对于动态注册的

在这里插入图片描述

对于静态注册的

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值