admin 管理员组

文章数量: 1087652

Android再进阶之广播发送、接收和注册过程

广播的注册分为静态注册和动态注册,静态注册在应用安装的时候由PackageManagerService来完成注册。这里只介绍动态注册。

  1. 动态注册
  • 调用registerReceiver方法,它在ContextWrapper中实现,mBase具体指向就是ContextImpl,ContextImpl的registerReceiver方法有很多重载的方法,最终调用registerReceiverInternal方法,它会调用IActivityManager的registerReceiver方法,最终调用AMS的registerReceiver方法。

广播的发送和接收过程分为两个过程来进行,分别是ContextImpl到AMS的调用过程和AMS到BroadcastReceiver的调用过程。

  1. 广播的发送和接收过程

ContextImpl到AMS的调用过程

  • 广播包括多种类型。包括无序广播、有序广播和粘性广播。要发送无序广播需要调用sendBroadcast方法,它在ContextWrapper中实现,给出调用流程:sendBroadcast()(ContextWrapper) -> sendBroadcast(ContextImpl) -> broadcastIntent(IActivityManager) -> broadcastIntent(AMS) -> broadcastIntentLocked(AMS),需要注意AMS中的verifyBroadcastLocked方法,会确认广播的合法性。

AMS到BroadcastReceiver的调用过程

  • BroadcastQueue的scheduleBroadcastLocked方法开始,向BroadcastHandler类型的mHandler对象发送了BROADCAST_INTENT_MSG类型的消息,这个消息会在handleMessage方法中调用了processNextBroadcast方法,它会分别处理无序和有序广播,它通过while循环将消息发送给对应的广播接收者,获取每一个mParallelBroadcasts列表中存储的BroadcastRecord类型的r对象,通过函数deliverToRegisteredReceiverLocked发送给注册者。
  • 它会检查广播发送者和接收者的权限,调用performReceiveLocked方法,在scheduleRegisteredReceiver方法中调用了IIntentReceiver类型的对象,receiver的performReceive方法,这个类型的对象用于跨进程通信。它是Binder通信的客户端,InnerReceiver在本地的代理,具体实现是InnerReceiver。在InnerReceiver的performReceive方法中调用ReceiverDispatcher类型的rd对象的performReceive方法。
  • 它将广播intent等信息封装为Args对象,会通过getRunable方法以及H发送到线程的消息队列中,这个个法会调用BroadcastReceiver类型的receiver对象的onReceive方法,这样就完成了消息的接收。

本文标签: Android再进阶之广播发送接收和注册过程