更新时间 | 修改意见 |
---|---|
2016-08-02 | 陈敏 |
第4节 Broadcast的使用权限
为广播设置权限要考虑两方面的问题。
- 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播;
- 作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格;
无论是上面哪种情况,解决方法都是一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果。
4.1 限制接收者
假设组件A要发布广播,
在
AndroidManifest.xml
文件中,与<application/>
同级的位置,对外声明使用权限,表示这个应用发布了一个叫做com.anddle.receiver.receivebroadcast
的权限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <permission android:name="com.anddle.receiver.receivebroadcast" android:label="receiver permission" android:protectionLevel="normal" /> <application ....../> </manifest>
在组件向整个系统发布广播的时候,就采用,
//前一个参数是广播的名称,后一个参数是广播权限的名称 sendBroadcast("custom.action.mybroadcast","com.anddle.receiver.receivebroadcast");
这里的广播权限
com.anddle.receiver.receivebroadcast
,就是AndroidManifest.xml
中声明的权限。
当接收者
要接收这种广播的时候,
接受者
需要在它的AndroidManifest.xml
当中静态的定义好接收机
对应的receiver
,或者在代码当中动态的定义好接收机
对应的receiver
;在它的
AndroidManifest.xml
当中,声明要使用的权限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!--声明要使用的权限--> <users-permission android:name = "com.anddle.receiver.receivebroadcast"/> <application ......> <!--假设采用的是静态定义的接收机--> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="custom.action.mybroadcast"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </application> </manifest>
4.2 限制发送者
假设接收者1
要设置权限,只接收特定发送者
发来的广播,
在
AndroidManifest.xml
文件中,对要设置权限的Broadcast Receiver
设置上android:permission
属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。例如com.anddle.receiver.sendbroadcast
,<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true" android:permission="com.anddle.receiver.sendbroadcast" />
在
AndroidManifest.xml
文件中,与<application/>
同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做com.anddle.receiveraccess
的权限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <permission android:name="com.anddle.receiver.sendbroadcast" android:label="receiver permission" android:protectionLevel="normal" /> <application ....../> </manifest>
其中
android:name
属性的值,就是<receiver/>
标签中设置的android:permission
的值。
发送者B要发送相应的广播,就要
在B的
AndroidManifest.xml
中加入权限的使用,<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.anddle.calculator"> <uses-permission android:name="com.anddle.receiver.sendbroadcast"/> <application ....../> </manifest>
其中,
<uses-permission/>
标签中设置的android:name
的值,就是应用A中对外声明的那个Broadcast Receiver
的权限值。使用代码发送广播,
Intent i = new Intent("custom.action.mybroadcast"); sendBroadcast(i);
4.3 接收其它应用的广播
在应用的AndroidManifest.xml
文件中,Broadcast Receiver
具有android:exported
属性,
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"></receiver>
android:exported
属性设置成true
:可以接收其他应用发来的广播;android:exported
属性设置成false
:不能接收其他应用发来的广播;
所以当两个不同的应用之间需要发送和接收广播的时候,需要把这个属性设置成true
。
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/
第5节 系统的广播
系统提供了很多现成的广播,开发者可以根据自己应用的需要,关注某些特定的广播。这里介绍几种使用频率最高的广播。
5.1 开机完成
有的时候,应用希望在开机完成之后,启动一个在后台运行的Service
。例如我们常用的微信应用,开机后会启动一个Service
和网络相连,如果有消息来,就通知我们有朋友发消息来了。
但是系统刚启动,用户没有主动打开微信,那么这个微信的Service
是不会运行起来的。这时候,就可以使用Broadcast Receiver
了,让它关注一个叫做android.intent.action.BOOT_COMPLETED
的广播,
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.intent.action.BOOT_COMPLETED" />
这样,等开机完成后,系统发出android.intent.action.BOOT_COMPLETED
广播后,MyReceiver
就可以收到这条广播,进行自己的处理-例如运行一个Service
了。
使用这条广播有个很重要的地方需要注意,从Android 4.0的系统开始,安装了这个应用以后,用户必须手动启动一次该应用(运行该应用的Activity),这样重启设备之后,就能收到android.intent.action.BOOT_COMPLETED
广播了。
5.2 时间变化
如果我们很关心时间的变化,例如要实现一个时钟,每一秒的变化,时间设置改变,时区变化都将是关心的内容。
所以,可以创建动态的接收机
监听3种广播,
Intent.ACTION_TIME_TICK
;Intent.ACTION_TIME_CHANGED
Intent.ACTION_TIMEZONE_CHANGED
final IntentFilter filter = new IntentFilter();
//监听每一秒的变化
filter.addAction(Intent.ACTION_TIME_TICK);
//监听时间设置的改变
filter.addAction(Intent.ACTION_TIME_CHANGED);
//监听时区的改变
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
registerReceiver(receiver, filter);
同时将接收机
定义成,
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) {
//每一秒发生变化
}
else if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) {
//时间发生变化
}
else if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
//时区发生变化
}
}
};
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。
*最后再次感谢各位读者对安豆
的支持,谢谢:)
/*******************************************************************/