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

第4节 Broadcast的使用权限

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

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

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

4.1 限制接收者

假设组件A要发布广播,

  1. 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>
  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文件中,与同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做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要发送相应的广播,就要

  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())) {
         //时区发生变化
       }
   }
};
时间: 2024-08-28 20:57:39

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

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他所有的原理搞懂,但是最起码的,我要把他的各种使用方法了如指掌才行 BroadcastReceiver 接收系统的广播,比如电话,短信之类的 1.IP拨号器 我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,

Android四大组件之~~BroadcastReceiver

声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45672601 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:BroadcastReceiver. BroadcastReceiver:顾名思义,广播接收者,可以接收系统,其他应用等等发送的广播进而做出相应的反应.比如

Android 四大组件 (三) BroadcastReceiver 介绍

一. BroadcastReceiver 使用场景 Broadcast主要是用作消息通信(专业术语叫IPC),Android的IPC基本都是binder来实现,那么这里的BroadcastReceiver其实也是对binder的一个封装,方便上层调用.开发过程中遇到的单进程多线程通信的场景比较多,所以这种情况下使用Broadcast并不是最佳选择,很多人会自己实现一套 Observer 或者使用EventBus等第三方库来完成该功能,不可否认,他们在这种场合下不论是效率还是灵活性方面都更具优势.

Android四大组件之BroadcastReceiver详细解析

什么是BroadcastReceiver? BroadcastReceiver作为Android四大组件之一,在实际开发中也发挥着重要的作用,广播机制在Android程序通信中至关重要,广播其实与我们现实生活中的电台很相似,电台在某个频道上发送它的内容,那么只要有在收听这个频道的人都会收到这些内容.在Android中,广播也同样分为两个角色:广播发送者.广播接收者. BroadcastReceiver的应用场景 1.在一个应用中,我们的Activity与Service的通信就需要用到广播来作为中

四大组件之BroadcastReceiver(一)-自定义“收音机”与发送“广播”

第1节 Broadcast Receiver概述 很多时候,我们希望一个应用程序在它没有运行起来的时候,也能感知系统状态的某些变化,如果条件合适,就让这个应用就运行起来. 比如,一个拦截骚扰电话的应用,平时它可能并不需要运行起来,它只关心有电话来的时候,看看这个号码是不是骚扰电话的号码,如果是就给用户发出一个提示,如果不是,那就和它没有关系,啥也不做. 为了实现这类功能,安卓系统引入了四大组件之一的BroadcastReceiver,设计了一套广播与接收的机制, 任何应用或者安卓系统的自身组件可

第五十九讲:四大组件之BroadcastReceiver(二)

没有任何动物比蚂蚁更勤奋,然而它却最沉默寡言. 本讲内容: Broadcast Receiver 广播接收者的使用 上一讲我们讲解了一个接收者来接收广播,如果有多个接收者都注册了相同的广播地址,又会是什么情况呢,这就涉及到普通广播和有序广播的概念了. 一.普通广播(Normal Broadcast) 普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响.对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作. 我们新建二个Broad

[02] 四大组件之BroadcastReceiver

一.BroadcastReceiver的基本概念 广播接收者,无界面,用来接收系统事件或自定义广播(intent形式).可以用它对外部事件进行过滤并只对感兴趣的事件作出响应,比如网络变化,电量变化等,也可以是启动一个activity或Service或弹出一个Notification等. 广播分类: 随机广播:通过Context.sendBroadcast()发送.所有接收者接收顺序随机,不能结束或终止广播. 有序广播:通过Context.sendOrderedBroadcast()发送,根据优先

Android四大组件之BroadcastReceiver

广播接收者  现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息 Android中:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变.收发短信.拨打电话.屏幕解锁.开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码.使用广播接收者,就可以收听广播 创建广播接收者 1. 定义java类继承BroadcastReceiver 2. 在清单文件中定义receiver节点,定义name属性,指定广播接

第六十讲:四大组件之BroadcastReceiver(三)

如果把生活比喻为创作的意境,那么阅读就像阳光. 本讲内容:举几个常见的例子加深一下对BroadcastReceiver广播的理解和应用: 一.开机启动服务 我们经常会有这样的应用场合,比如消息推送服务,需要实现开机启动的功能.要实现这个功能,我们就可以订阅系统"启动完成"这条广播,接收到这条广播后我们就可以启动自己的服务了.我们来看一下BootCompleteReceiver和MsgPushService的具体实现: public class BootCompleteReceiver