四大组件之BroadcastReceiver(二)-使用权限和常用的系统广播
2016-06-24 12:43
351 查看
第4节 Broadcast的使用权限
为广播设置权限要考虑两方面的问题。作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播;
作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格;
无论是上面哪种情况,解决方法都试一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果。
4.1 限制接收者
假设组件A要发布广播,在
AndroidManifest.xml文件中,与同级的位置,对外声明使用权限,表示这个应用发布了一个叫做
com.anddle.receiver.receivebroadcast的权限,
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <permission android:name="com.anddle.receiver.receivebroadcast" android:label="receiver pomission" 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文件中,与同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做
com.anddle.receiveraccess的权限,
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <permission android:name="com.anddle.receiver.sendbroadcast" android:label="receiver pomission" 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。
/[b]*******************************************************************[/b]/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/[b]*******************************************************************[/b]/
第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())) { //时区发生变化 } } };
相关文章推荐
- Ryan的OC学习总结-----5 协议
- Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
- 新的·开始
- 四种加密算法之RSA源代码-C++
- SSH整合实践与自我总结
- 第十五周项目二洗牌二
- python 虚拟环境
- 测试
- 解析json
- 飛飛(终极版)关于贺利坚贺老师的感受和总结
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
- 开发者和程序员需要关注的42个播客
- ANDROID版本号和版本名称的重要性介绍
- wireshark https 抓包
- HttpClient使用详解
- JS组件系列——表格组件神器:bootstrap table
- Servlet3.0学习总结(一)——使用注解标注Servlet
- 歌曲《圣诞节十二天》歌词打印("The Twelve Days of Christmas" Song)
- leetcode 78. Subsets
- (转)linux虚拟内存管理简要总结