BroadCastReceiver的复习
简单跟老师串了一下广播的几个流程,静态注册和动态注册广播,以及从发送者的角度和接收者的角度来设置权限。
首先是监听电量变化的广播,这里使用的动态注册,从Android8.0开始必须要使用动态注册的方式了。
在注册的时候需要一个IntentFilter过滤器,addAction()里面形参是String类型,可以是自己定义的字符串,也可以使用系统定义的,不过系统定义的都有特定的含义。
加上权限之后才能接收到电量变化发送的广播
这里添加的是Intent.ACTION_BATTERY_CHANGED,可以理解为我的batteryLevelReceiver能够接收来自action等于Intent.ACTION_BATTERY_CHANGED的发送方发送来的数据。
最后在onDestory方法里面unregisterReceiver来注销接收器。
其实查看源码就能发现,其实每一个系统的功能都对应着一个类,里面为我们提供了很多个常量,我们可以把电池电量的改变看作是一个发送方发送了一个广播,
它为我们提供的这些常量,就可以用来获取到发送方包裹里面的内容,比如下方的内容
其中EXTRA_LEVEL这个常量用来获取电量的值,一般默认是从0-100的整数 EXTRA_SCALE代表最大电量值,要想显示百分比应该使用前者除以后者再×100%
这两个常量代表USB的接入和接出。我一个IntentFilter其实可以添加多个Action,当不同的发送方携带不同的action的时候,我们就可以在onReceive方法里面进行判断,通过
intent.getAction方法来得到我们发送方的action
其次是静态注册广播
这里需要注意有的系统广播是需要加权限的,否则接收不到发送的广播。这里的action里面name属性的值代表的含义是开机之后发送的一个广播
这里还需要注意:静态注册并不会释放掉我们的资源,会一直占用,这里要注意了。
以上两个常量代表的是安装和卸载所对应的action。
对于发送有序广播而言,sendOrderBroadCast是发送的方法,这里的priority代表的是优先级,优先级越高越先收到通知。
’abortBroadCast用来阻断广播的传输。
关于sendOrderBroadCast方法一共有七个参数,具体解释如上所示。
这里的第七个参数传递的是一个包裹,我们可以在中途修改广播携带包裹中的内容。
比如我这里有三个接收器,第一个优先级高的先接收到数据之后,先getResultExtras()来获取到bundle,再通过put的一系列方法来修改包裹中的内容
最后通过setResultExtras()方法来修改和设置包裹,这样第二个接收器接收到的数据就会有所不同。
然后是两个重量级的家伙。
第一:Android权限,谁能接收到我的广播
在发送广播的一端通过在xml中设置权限,然后在sendOrderBroadCast的第二个形参中通过Manifest.permission.ORDER_PERMISSION来设置接收方需要拥有persmission权限才能获取到广播。
这里我报错了,太困了,白天再检查。
从接收方的角度,可以先声明一个permissIon,然后添加到receiver标签的permission属性。
在发送方的xml文件里面需要声明user-permission才能像设置权限的接收方发送数据。