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);