Android广播纪要

Android广播机制是一种组件间传递消息的方式,支持同一进程及跨进程通信,底层实现基于Binder。

广播机制是一种基于消息发布和订阅的事件驱动模型,因此需要注册广播接收者即Broadcast Receiver,注册方式分为静态注册(在Manifest文件中配置)与动态注册(在Activity或Service里代码实现),同等条件下,动态注册的广播接收者比静态注册的优先接收到广播。

广播接收者被注册到ActivityManagerService中,注册的同时指明了接收广播的类型,还可以指定优先级。当广播发生时,ActivityManagerService会将对应的广播发送到对应的接收者。实际上,Activity组件在注册一个广播接收者时,并非真的将这个广播接收者注册到ActivityManagerService中,而是将与它关联的一个InnerReceiver对象注册到ActivityManagerService中。当ActivityManagerService收到一个广播时,它就会根据这个广播的类型在内部找到对应的InnerReceiver对象,然后再通过InnerReceiver对象将这个广播发送给对应的广播接收者处理。

广播发送方式分为有序广播和无序广播。当ActivityManagerService收到有序广播时,会将该广播优先发给符合接收条件且优先级高的接收者来处理,然后再发送给符合接收条件但优先级低的接收者来处理。对于无序广播,ActivityManagerService会忽略接收者的优先级,将该广播发给所有符合接收条件的接收者处理。

当一个粘性(Sticky)广播被发送到ActivityManagerService后,就会一直保存在ActivityManagerService中,直到ActivityManagerService下次再接收到另外一个同类型的粘性广播为止。一个Activity组件在向ActivityManagerService注册接收某一种类型的广播时,如果ActivityManagerService内部恰好有这种类型的粘性广播,那么ActivityManagerService就会将这个粘性广播返回给该Activity组件,以便它可以知道系统上次发出的它所感兴趣的广播内容。可以通过调用sendStickyBroadcast向ActivityManagerService发送一个粘性广播。

广播是使用一个Intent对象来描述的,而这个Intent对象的Action名称就是用来描述它所对应的广播的类型。

广播的发送过程:

  1. 广播发送者,如Activity或Service组件,将一个特定类型的广播发送给ActivityManagerService。
  2. ActivityManagerService接收到一个广播之后,首先找到与这个广播对应的接收者,然后将它们添加到一个广播调度队列中,最后向ActivityManagerService所运行的线程的消息队列发送一个类型为BROADCAST_INTENT_MSG的消息,这时候对于广播发送者来说,一个广播就发送完成了。
  3. 当发送到ActivityManagerService所运行线程的消息队列中的BROADCAST_INTENT_MSG消息被处理时,ActivityManagerService就会从广播调度队列中找到需要接收广播的接收者,并且将对应的广播发送给它们所运行在的应用程序进程。
  4. 广播接收者所运行在的应用程序进程接收到ActivityManagerService发送的广播之后,并非直接将收到的广播分发给广播接收者来处理,而是将接收到的广播封装成一个消息,并且发送到主线程的消息队列中。当这个消息被处理时,应用程序进程才会将它所描述的广播发送给相应的广播接收者处理。

参考文献《Android系统源代码情景分析》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值