广播的发送始于客户端对sendBroadcast(…)的调用,该函数继承自ContextWrapper::sendBroadcast(…)。
Step1 ContextWrapper::sendBroadcast(…)
1 | // frameworks/base/core/java/android/app/ContextImpl.java:395 |
mBase的类型为ContextImpl。
Step2 ContextImpl::Broadcast(…)
1 | // frameworks/base/core/java/android/app/ContextImpl.java:762 |
Step3 ActivityManagerProxy::broadcastIntent(…)
1 | // frameworks/base/core/java/android/app/ActivityManagerNative.java:3033 |
它向ActivityManagerService发送一个BROADCAST_INTENT_TRANSACTION请求,以上步骤是在客户端完成的,接下来将转入ActivityManagerService。
Step4 ActivityManagerService::broadcastIntent(…)
1 | // frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:17001 |
Step5 ActivityManagerService::broadcastIntentLocked(…)
1 | // frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:16497 |
由此可见,无论对于有序还是无序广播,都会把目标接收者保存到mOrderedBroadcasts中,对于无序广播,会再保存到mParallelBroadcasts中。
Step6 BroadcastQueue::scheduleBroadcastsLocked()
1 | // frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java |
mBroadcastsScheduled的类型为BroadcastHandler。
Step7 BroadcastHandler::handleMessage(…)
1 | // frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:163 |
Step8 BroadcastQueue::processNextBroadcast(…)
1 | // frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:639 |
假设广播r的下一个目标接收者是:(动态注册 || (静态注册 && 进程已经启动起来) )那么接下来就会调用deliverToRegisteredReceiverLocked(…)将广播转发给该接收者处理。
Step9 BroadcastQueue::deliverToRegisteredReceiverLocked(…)
1 | // frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:465 |
Step10 BroadcastQueue::performReceiveLocked(…)
1 | // frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:445 |
app.thread是引用了运行在该进程中的一个ApplicationThread对象的Binder代理对象,其类型为ApplicationThreadProxy。
Step11 ApplicationThreadProxy::scheduleRegisteredReceiver(…)
1 | // frameworks/base/core/java/android/app/ApplicationThreadNative.java:707 |
它向发送广播消息的应用程序发送SCHEDULE_REGISTERED_RECEIVER_TRANSACTION请求,接下来转入应用程序。
Step12 ApplicationThread::scheduleRegisteredReceiver(…)
1 | // frameworks/base/core/java/android/app/ActivityThread.java:150 |
receiver指向一个InnerReceiver对象。
Step13 InnerReceiver::performReceive(…)
1 | // frameworks/base/core/java/android/app/LoadedApk.java:786 |
Step14 ReceiverDispatcher::performReceive(…)
1 | // frameworks/base/core/java/android/app/LoadedApk.java:786 |
Step15 Args::run()
1 | // frameworks/base/core/java/android/app/LoadedApk.java:786 |