admin 管理员组文章数量: 1087652
Android再进阶之广播发送、接收和注册过程
广播的注册分为静态注册和动态注册,静态注册在应用安装的时候由PackageManagerService来完成注册。这里只介绍动态注册。
- 动态注册
- 调用registerReceiver方法,它在ContextWrapper中实现,mBase具体指向就是ContextImpl,ContextImpl的registerReceiver方法有很多重载的方法,最终调用registerReceiverInternal方法,它会调用IActivityManager的registerReceiver方法,最终调用AMS的registerReceiver方法。
广播的发送和接收过程分为两个过程来进行,分别是ContextImpl到AMS的调用过程和AMS到BroadcastReceiver的调用过程。
- 广播的发送和接收过程
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再进阶之广播发送接收和注册过程
版权声明:本文标题:Android再进阶之广播发送、接收和注册过程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1687332556a90555.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论