广播的操作包括发广播和接收广播

——从发广播的角度上划分,可以分为系统广播和第三方广播

——从接收的角度上划分,可以分为有序广播和无序广播

(常见的广播有:系统的开机完成广播、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属性就是用于声明哪些应用有权限给本接收者发送广播

 

posted on 2021-09-06 16:52  Danile97  阅读(174)  评论(0编辑  收藏  举报