您的位置:首页 > 其它

四大组件之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())) {
//时区发生变化
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: