AMS治下的广播注册发送

Android系统的广播是用来发送消息的,既可以在同个进程中进行,也可以跨进程接收消息。那么既然有了binder通信机制了,为何还要有广播存在。实际上,广播是可以做到完全解耦的,调用者不需要知道它是谁,在哪调用,只管自己要发送什么即可。这样,在把广播发到任一一个应用进程就显得很简单。而Binder机制下的通信,首先得知道对方服务在哪,是否已启动了,得先获得代理。

Android系统有两种广播形式——静态广播和动态广播。静态广播在AndroidManifest中定义,动态广播在应用程序中动态注册。应用程序动态注册的广播,经过ActivityManagerService,保存对应进程下的广播列表中,相关广播和filter进行关联。如下图:


18582563-ac18dc0429e42d58.png

上图中主要是动态注册的流程,这里在mPackageInfo.getReceiverDispatcher()的时候,会生成一个InnerReceiver的stub binder对象。这个对象就是便是后面发送广播的时候,通过解析该广播对应的InnerReceiver binder对象,通过该binder对象进行相应广播的接收。对于静态广播有点区别,静态广播随着应用程序安装广播列表保存在PMS中,然后当第一次接收广播的时候,从PMS查询对应Intent的广播列表,也既静态注册的广播接收者在第一次接收广播的时候,才会启动起来,这个时候如果没有对应的应用程序,还会启动应用程序。

上面分析的是广播的注册开启,接下来分析广播发送的时候,广播接收者是如何通过AMS接收的。如下图:

1. 发送广播从sendBroadcast开始,到达ActivityManagerService。AMS根据广播的Action类型找到对应的广播接收器,把广播放进消息队列中;

2. AMS在消息循环中处理这个广播,并通过binder进程通信(这里为啥可以进行进程间通信可以看下文Binder机制下的应用程序启动)分发给注册的广播接收器ReceiverDispatcher,ReceiverDispatcher进而把这个广播放到发出广播发出者所在线程的消息队列中去(ActivityThread的post发送)

3. ReceiverDispatcher的内部类Args在发出广播这的线程中处理改消息,最终将这个广播发送给所注册的BroadcastReceiver实例的onReceive函数进行处理。


18582563-b761ee4c04d238ff.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值