四大组件之BroadcastReceiver(二)-使用权限和常用的系统广播

更新时间修改意见
2016-08-02陈敏

第4节 Broadcast的使用权限

为广播设置权限要考虑两方面的问题。

  1. 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播;
  2. 作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格;

无论是上面哪种情况,解决方法都是一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果。

4.1 限制接收者

假设组件A要发布广播,

  1. 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>
  2. 在组件向整个系统发布广播的时候,就采用,

    //前一个参数是广播的名称,后一个参数是广播权限的名称
    sendBroadcast("custom.action.mybroadcast","com.anddle.receiver.receivebroadcast");

    这里的广播权限com.anddle.receiver.receivebroadcast,就是AndroidManifest.xml中声明的权限。

接收者要接收这种广播的时候,

  1. 接受者需要在它的AndroidManifest.xml当中静态的定义好接收机对应的receiver,或者在代码当中动态的定义好接收机对应的receiver

  2. 在它的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要设置权限,只接收特定发送者发来的广播,

  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" />
  2. 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要发送相应的广播,就要

  1. 在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的权限值。

  2. 使用代码发送广播,

    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>
  1. android:exported属性设置成true:可以接收其他应用发来的广播;
  2. 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种广播,

  1. Intent.ACTION_TIME_TICK
  2. Intent.ACTION_TIME_CHANGED
  3. 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编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值