在进行应用设计时,需要获取很多环境参数,像电量,音量,亮度,网络等。相比较每次去询问android这些信息改变了吗.让Android告诉我们,这些信息改变了更加合理。只要这些信息改变,Android通过就以广播的方式通知各个应用。当然前提是应用告诉android,应用需要这些信息。
一、Receiver
我们在应用中怎么告诉android,我们需要知道网络,电量是否改变呢?向系统注册一个该类型的广播接收器,系统就会告诉你这些消息了。注册广播可以在程序运行的时候动态注册销毁,也可以在程序运行前注册。
1、 动态注册销毁
假如我要接收音量改变的消息,首先要有个Receiver表示收到消息之后的动作。
然后就是注册了。通常在start里面注册。使用intent filter设置要接收的消息类型。
有注册就有销毁,在stop里面销毁。
在音量改变之后,android会自己调用在receiver中方法,因为我们已经注册了。
2、 静态注册
静态与动态的区别,在于静态是在清单文件里面向android注册。程序运行前就已经注册。
首先也是需要一个处理消息的Receiver,比如一个处理开机消息的Receiver,收到开机消息之后,就启动一个后台服务。
之后就在清单文件里面注册。
需要注意的是,接收这个消息需要声明权限。
二、发送自己的广播
上面谈到的消息都是android发出的,假如我们要在某一个时刻发一个自己的消息。可以使用Context.sendBroadcast或者Context.sendOrderedBroadcast发送,消息内容要借助intent。
1、 普通广播
使用Context.sendBroadcast发送的广播就是普通广播。发送广播需要通过android,这种模式下,android会把你发送的消息转发给所有注册了该消息的应用。
2、 有序广播
使用Context.sendOrderedBroadcast发送的广播叫有序广播。Android在转发的时候,先发给优先级高的Receiver。优先级在注册的时候通过intent设定。Receiver收到消息后可以调用abortBroadcast终止广播继续传播。还可以通过setResult为该广播添加附带消息。在优先级低的Receiver中调用getResultData等方法得到附带消息。
三、其他
需要注意,作为四大组件之一,Receiver同样运行在主线程。一个Receiver长时间运行就会被android干掉。这个时间不会超过10s。