android中的广播机制

在android系统中,广播(Broadcast)是一种在组件之间进行消息传递的方式。这些组件可以运行在同一个进程中,也可以运行在不同的线程中。当两个不在同一进程中的组件通过广播机制来传送消息时,广播机制就有点类似Binder进程间的通信机制。事实上广播机制就是在Binder进程间通信机制的基础上实现的。它们的区别就是:在Binder进程间通信机制中,不同进程的两个组件通信之前,必须要先获得他的一个代理对象,即一个组件要事先知道另外一个组件存在。然而在广播机制中,广播发送者事先是不知道广播接收者的存在,这样可以降低广播发送者和接受者之间的耦合度,进而提高系统的可扩展性和可维护性。
广播机制是一种基于消息发布和订阅的事件驱动模型,即广播接收者需要先订阅消息,然后才能接收消息。android系统将广播接收者抽象为一种Broadcast Receiver组件,它是android应用程序的四大组件之一。同时,android应用程序的另外两种组件Activity和Service组件被赋予了发送广播的能力,所以使用广播机制在组件之间传递消息是非常方便的。
广播机制存在一个注册中心,它由ActivityManagerService来担当。广播接收者订阅消息的表现形式就是将你自己注册到ActivityManagerService中,并且指定要接收的类型,当广播发送者向接收者发送一个广播时,这个广播首先发送到ActivityManagerService中,然后ActivityManagerService根据这个广播的类型找到相应的广播接收者,最后这个广播发送给它们进行处理。
广播接收者的注册方式分为静态注册和动态注册两种。在静态注册方式中,用来描述广播接收者的Broadcast Receiver组件必须要在配置文件中注明它们所感兴趣的广播类型,以便ActivityManagerService可以找到它们。在动态注册方式中,我们需要在代码中手动地调用Context接口的成员函数registerReceiver将Broadcast Receiver组件注册到ActivityManagerService中。Activity和Service组件都实现了Context接口。在同等情况下,动态注册的广播接收者要比静态注册的广播接收者优先接收到广播。
广播的发送方式分为有序和无序两种,在注册广播的时候可以指定它们的优先级,当ActivityManagerService接收到有序广播时,它会先将这个有序广播发送给符合条件的优先级高的广播接收者处理;而ActivityManagerService接收到无序的广播时,它会忽略接收者的优先级,并行地将这个无序广播发送给所以符合条件的广播接收者处理。

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