课后习题
1. 广播机制的实现过程
答:Android中的广播使用了观察者模式,即基于消息的发布/订阅事件的模式。广播发送者和接收者分别处于观察者模式中的消息发布和订阅两端。广播机制的实现过程具体如下:
①广播接收者通过Binder机制在AMS(Activity Manager Service)中进行注册。
②广播发送者通过Binder机制向AMS发送广播。
③AMS查找符合相应条件(IntentFilter/Permission)的广播接收者,将广播发送到相应的消息循环队列中。
④执行消息循环时获取到发送的广播,然后回调广播接收者中的onReceive()方法并在该方法中进行相关处理。
2. 简述有序广播和无序广播的区别
答:广播分为有序广播和无序广播,他们有以下几点的区别。
(1) 发送广播时,使用的方法不同
有序广播使用sendOrderedBroadcast()发送广播,而无序广播使用sendBroadcast()方法发送广播。
(2) 广播接收者执行的顺序
a)有序广播的接收者是顺序执行的
有序广播按照广播接收者声明的优先级别被依次接收。当在高级别的广播接收者逻辑执行完毕之后,广播才会继续传递。当优先级相同时,先注册的广播接受者优先执行。
b)无序广播是完全异步执行的
当发送无序广播时,所有监听这个广播的广播接收者都会接收到此广播消息,但接收和执行的顺序不确定。
(2)拦截广播
有序广播的接收者可拦截广播。如果优先级较高的广播接收者将广播终止,那么广播将不再向后传递。而无序广播则不能被拦截。
(3)效率
有序广播的效率比无序广播低
8.1广播机制概述
Android中的广播(Broadcast)机制用于进程/线程间通信,该机制使用了观察者模式,观察者模式是一种软件设计模式,在该模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时会主动发出通知。观察者模式是基于消息的发布/订阅事件模型,该模型中的消息发布者是广播机制中的广播发送者,消息订阅者是广播机制中的广播接收者
广播机制的实现流程:
①广播接收者通过Binder机制在AMS(Activity Manager Service)中进行注册
②广播发送者通过Binder机制向AMS发送广播
③AMS查找符合相应条件(IntentFilter/Permission)的广播接收者(BroadcastReceiver),将广播发送到相应的消息循环队列中
④执行消息循环时获取到此广播,会回调广播接收者中的onReceive方法并在该方法中进行相关处理
AMS属于中间的处理中心
广播发送者和广播接收者的执行时异步的,发出去的广播不会关心有无接收者接收,也不确定接收者到底何时才能接收到
广播的使用场景:
①在同一个APP内部的同一组件内进行消息通信(单个或多个线程之间)
②在同一个APP内部的不同组件之间进行消息通信(单个进程)
③在同一个APP具有多个进程的不同组件之间进行消息通信
④在不同APP的组件之间进行消息通信
8.2广播接收者
8.2.1什么是广播接收者
Android提供了一个BroadCastReceiver组件,该组件可以监听来自系统或者应用程序的广播
广播接收者需要在清单文件或者代码中进行注册并指定要接受的广播事件,然后创建一个继承自BroadcastReceiver的类,重写onReceive放,并在该方法中对广播事件进行处理
8.2.2广播接收者的创建
1.动态注册
动态注册的广播接收者是否被注销依赖于注册广播的组件
2.静态注册
静态注册的特点是无论应用程序是否处于运行状态,广播接收者都会对程序进行监听
8.3自定义广播与广播的类型
8.3.1自定义广播
当自定义广播发送消息时,会将消息存储到公共消息区,而公共消息区如果存在对应的广播接收者,则会及时接收这条信息,广播的这种机制可以处理程序中信息的传递功能
自定义广播的同时要编写对应的广播接收者
8.3.2实战演练
8.3.3广播的类型
Android系统中提供了两种广播类型,分别是有序广播和无序广播,开发者可根据需求为程序设置不同的广播类型
1.无序广播
无序广播是完全异步执行的,发送广播时,所有监听这个广播的广播接收器都会接收到此广播消息,但接收和执行的顺序不确定,无序广播的效率比较高,但无法被拦截
2.有序广播
有序广播是按照广播接收者声明的优先级别被依次接收,发送广播时,只会有一个广播接收者能够接收此消息,当此广播接收者中逻辑执行完毕之后,广播才会继续传递。相比无序广播,有序广播的广播效率较低,但此类型是由先后顺序的,并可被拦截
在动态注册接收者时,可以使用对象的setPriority方法设置优先级别,属性值越大,优先级越高
如果两个程序监听同一个广播事件,同时设置了相同的优先级,则先安装的程序优先接收
8.3.4实战演练-发送有序广播
①MyBroadcastReceiverOne.java
②MainActivity.java