广播的操作包括发广播和接收广播
——从发广播的角度上划分,可以分为系统广播和第三方广播
——从接收的角度上划分,可以分为有序广播和无序广播
(常见的广播有:系统的开机完成广播、Wifi状态改变的广播、SD卡挂载的广播、电量改变的广播...)
——广播的注册方式又分为两种: 静态注册和动态注册
静态注册可以一直监听着,即使应用没有起来,也可以监听着,但是耗资源,长期监听着
静态注册的广播优先级高于动态注册的广播
动态注册的优点就是省资源,需要的时候才监听,不需要的时候需要取消注册
(发送广播和接收广播本质上还是用意图intent来传递的数据)
<1>模拟电量显示系统(动态注册)
写一个电量的显示系统,来接收系统中电量变化的广播
这就是动态注册的方式接收系统广播,在老的Android系统中还需要去系统配置文件Manifes.xml中配置一下
但Android 6.0往后系统就不允许这样设置权限了,直接用就好了
还要记得在应用退出的时候关闭广播,释放资源
如果想添加要接收的广播信息,直接在intentFilter.addAction即可
<2>模拟开机提示(静态注册)
新建一个类BoastCompleteReciever继承自BroadcastReceiver
(静态注册)注意写完后要去配置清单Manifest.xml中注册一下
这一步就类似与动态注册中对action的设置
然后我们就可以接收到开机的广播了
这种静态注册的方式是会一直在后台运行的,不用手动去取消广播
无论是动态注册还是静态注册,主要的原理都是一样的,要创建一个继承自BroadcastReceiver 的类,然后在这个类里面去重写onReveive()方法
这就类似于Activity的重写onCreate等方法一样,就是接收到广播后就会回调
区别就在于对aciton的配置
动态注册是在方法内配置的,方法调用才会开始接收广播
静态注册是在配置文件中配置的,会一直开启监听,比较耗费系统资源
<3>模拟应用的安装与卸载的广播
在Android系统中,应用的安装与卸载信息在Google看来并不是隐私,所以静态注册广播来接收应用的安装与卸载信息时不需要设置权限
只需要在配置文件中设置action值就好了(注意在这里我们还声明了data scheme 约束,用来获取到应用的信息)
<4>自己定义一个广播发送者以及接收
前面练习的几个例子都是接受了系统发出的广播,接下来自己定义广播发送者
使用场景一般有两种情况:
1,做SDK开发
2,应用内广播,也就是应用内的通知
——首先新建一个SendBroadcastActivity类继承Activity,实现广播发送操作
——然后新建一个类MessageReceiver继承自BroadcastReceiver实现接收广播的操作
——记得要去配置清单中注册一下这个MessageReceiver接收到的action是什么
可以看到这里接收到的action的name就等于发送端的action设置的值
然后在接收端就通过intent.getExtra(“键”)获得值
这就跟前面讲的通过意图实现跳转界面是一样的操作,只不过这个不是跳转界面,而是利用intent发送和接收获取广播信息
<5>一些只能动态注册的广播
有一些广播只能动态注册:
<6>高端操作:有序广播
前面的这些例子都是无序广播,发送出去后任何应用都可以接收到,只要配置对应的Action即可
而有序广播就类似于单位的通知,要一级一级地往下传,特点是:
1.有序
2.中途可以中断传递
3.中途可以修改传递的广播内容
无序广播和有序广播的区别:
无序广播是按注册顺序派发的,有序广播按优先级派发
有序广播可以终止/修改数据,无序广播不可以
有序广播的发送者主要就是调用sendOrderedBroadcast()方法
发送者的例子:
接收者的例子:
首先是学校收到捐款
然后年级接受到捐款
然后班级接收到捐款
最后学生接收到
在配置文件中注册这些广播接收者和广播发送者:
可以看到,每个接收者接收的顺序其实就是依据配置文件中对每个类的 priority 的值进行设置
这个值可以从1000到-1000,值越大越靠前接收到广播
而前面接收到的接收者可以随时停止往下继续发送广播,或者可以更改广播的信息
如何在中途修改数据以及如何停止往下传呢?
修改数据直接改 Bundle()中的值即可
例如在刚才的流程中,学校想修改数据就新建一个Bundle(),然后修改其键值对中的值,再setResultExtra()放入到原来的intent中即可
学校想停止往下传,就调用abortBroadcast()即可
<7>广播的权限
广播的权限分为两种,一种是可以指定本应用发送出的广播哪些程序可以接收到
另一种是指定哪些应用有权限给本应用发送广播
一:指定本应用发送的广播哪些程序可以接收到
首先要在AndroidManifest.xml中声明权限permission
例如:
然后在广播发送者发广播的时候加上这条权限
例如:
最后要在需要接收该条广播的应用的AndroidManifest.xml中添加权限
例如:
这样这些添加了这条uses-permission的应用就可以收到我们发送的广播了
二:指定哪些应用有权限给本应用发送广播
如果本应用中有receiver类实现了BroadcastReceiver接口,那么在配置文件中receiver的注册里就可以找到权限的配置
在receiver节点中的这个permission属性就是用于声明哪些应用有权限给本接收者发送广播