一、广播的发送
经常说”发送广播“和”接收“,表面上看广播作为Android广播机制中的实体,实际上这一实体本身是并不是以所谓的”广播“对象存在的,而是以”意图“(Intent
)去表示。定义广播的定义过程,实际就是相应广播”意图“的定义过程,然后通过广播发送者将此”意图“发送出去。被相应的BroadcastReceiver
接收后将会回调onReceive()
函数。
下段代码片段显示的是一个普通广播的定义过程,并发送出去。其中setAction()
对应于BroadcastReceiver
中的intentFilter
中的action
。
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
sendBroadcast(intent);
根据不同类型的广播调用相对应的send方法。
- 普通广播(
NormalBroadcast
):sendBroadcast(Intent)(Intent, String)
- 有序广播(
OrderedBroadcast
):sendOrderedBroadcast(Intent, String)
- 系统广播(
SystemBroadcast
):发生各种事件时,系统自动发送 - 本地广播(
LocalBroadcast
):LocalBroadcastManager.sendBroadcast(intent)
- 粘性广播(
StickyBroadcast
):已弃用(API 21)
具体类型可查看《BroadcastReceiver-广播(四)五种类型》
二、自定义广播权限
2.1、自定义一个广播权限
- 在
AndroidManifest.xml
中,声明一个权限,名为com.example.receiver.receivebroadcast:
<permission
android:name="com.example.receiver.receivebroadcast"
android:label="BroadcastReceiverPermission"
android:protectionLevel="signature">
</permission>
<!--声明要使用的权限-->
<users-permission android:name="com.example.receiver.receivebroadcast"/>
- 在自定义权限时,通常会指定
android:protectionLevel
属性,常用的如下:
- normal:默认的,应用安装前,用户可以看到相应的权限,但无需用户主动授权。
- dangerous:
normal
安全级别控制以外的任何危险操作。需要dangerous
级别权限时,Android会明确要求用户进行授权。常见的如:网络使用权限,相机使用权限及联系人信息使用权限等。- signature:它要求权限声明应用和权限使用应用使用相同的
keystore
进行签名。如果使用同一keystore
,则该权限由系统授予,否则系统会拒绝。并且权限授予时,不会通知用户。它常用于应用内部。把protectionLevel
声明为signature
。如果别的应用使用的不是同一个签名文件,就没办法使用该权限,从而保护了自己的接收者。
2.2、设置广播接收者
- 采用静态方式:
在接收方的AndroidManifest.xml
中,声明一个权限,名为com.example.receiver.receivebroadcast:
<receiver
android:name=".MBroadcastReceiver"
android:exported="false"
android:permission="com.example.receiver.receivebroadcast">
<intent-filter>
<action android:name="BROADCAST_ACTION"/>
</intent-filter>
</receiver>
- 采用动态方式:
// 注册广播代码
MBroadcastReceiver receiver = new MBroadcastReceiver ();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
//注册receiver时,直接指定发送者应该具有的权限。不然外部应用依旧可以触及到receiver
registerReceiver(receiver, intentFilter, "com.example.receiver.receivebroadcast", null);
// 发送广播代码
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
sendBroadcast(intent, "com.example.receiver.receivebroadcast");
在注册的时候,最关键的一点是用registerReceiver()
进行注册,而不是平常用的是registerReceiver()
。相较于后者,前者在注册的时候要求了发送者必须具有的权限。如果发送者没有该权限,那么发送者发送的广播即使经过IntentFilter
的过滤,也不会被receiver
接收。此时如果再自定义一个权限,并且将权限的protectionLevel
设置为signature
,那么外部应用便无法使用该权限,也就无法触及到该receiver
。
BroadcastReceiver-广播系列
《BroadcastReceiver-广播(一)实现原理及注册》
《BroadcastReceiver-广播(二)静态注册属性说明》
《BroadcastReceiver-广播(三)发送及自定义广播权限》
《BroadcastReceiver-广播(四)五种类型》
网友评论