BroadcastReceiver广播接收者用于接收系统或其他程序(包括自己程序)发送的广播。

一.注册广播

在android中,我们如果想接收到广播信息,必须自定义我们的广播接收者。要写一个类来继承BroadcastReceiver,并且重写其onReceive()方法,实现接收到特定广播所要做的事情。

这是一个自定义的广播接收者:

public class MyBroadCastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//在这里可以写相应的逻辑来实现一些功能
//可以从Intent中获取数据、还可以调用BroadcastReceiver的getResultData()获取数据
}
}

我们已经定义好了一个广播接收者。要想使用它接受到广播,就要注册这个广播接收者。

有两种方式注册广播:

(1)代码中动态注册

步骤如下:

  1. 实例化自定义的广播接收者
  2. 实例化意图过滤器,并设置要过滤的广播类型(如,我们接收收到短信系统发出的广播)
  3. 使用Context的registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)方法注册广播

代码:

//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver(); //实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); //注册广播
myContext.registerReceiver(smsBroadCastReceiver,intentFilter,
"android.permission.RECEIVE_SMS", null);

(2)在Manifest.xml中静态注册

直接在Manifest.xml文件的<application>节点中配置广播接收者。

 <receiver android:name=".MyBroadCastReceiver">
<!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->
<intent-filter android:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

还要在<application>同级的位置配置可能使用到的权限

<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>

(3)两种注册广播的不同

  1. 第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
  2. 第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

二.发送广播

当我们需要发送一个自定义的广播来通知程序中其他组件一些状态时,就可以使用发送一条广播的方式。

有两种方式分别发送两种不同的广播:
通过mContext.sendBroadcast(Intent)mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限);
通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。

区别
无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。

(1)无序广播的使用:

定义一个按钮,设置其点击事件,发送一个无序广播。

        Intent intent = new  Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
sendBroadcast(intent);

定义一个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到广播", Toast.LENGTH_SHORT).show();
}
}

在Manifest.xml中配置该接收者。

<receiver
android:name=".MyReceiver" >
<intent-filter>
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>

运行结果为:Toast打印出 “收到广播”。

(2)有序广播的使用

和无序广播使用不同的是 通过 mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每个接收者设置优先级,就可以在小于自己优先级的接收者得到广播前,修改或终止广播。

定义一个按钮,设置其点击事件,发送一个有序广播。

        Intent intent = new  Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
//第一个参数:intent
//第二个参数:String类型的接收者权限
//第三个参数:BroadcastReceiver 指定的接收者
//第四个参数:Handler scheduler
//第五个参数:int 此次广播的标记
//第六个参数:String 初始数据
//第七个参数:Bundle 往Intent中添加的额外数据
sendOrderedBroadcast(intent, null, null, null, "这是初始数据", );

定义多个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver1() {
}
@Override
public void onReceive(Context context, Intent intent) {
//获取广播中的数据(即得到 "这是初始数据" 字符串)
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
//修改数据
setResultData("这是修改后的数据");
}
}
public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
//终止广播
abortBroadcast();
}
}
public class MyReceiver3 extends BroadcastReceiver {
public MyReceiver3() {
}
@Override
public void onReceive(Context context, Intent intent) {
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
}
}

在Manifest.xml中配置该接收者。并设置优先级:MyReceiver1>MyReceiver2>MyReceiver3。

<!-- 优先级相等的话,写在前面的receiver的优先级大于后面的 -->
<receiver
android:name=".MyReceiver1" >
<!-- 定义广播的优先级 -->
<intent-filter android:priority="1000">
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2" >
<!-- 定义广播的优先级 -->
<intent-filter android:priority="0">
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver3" >
<!-- 定义广播的优先级 -->
<intent-filter android:priority="-1000">
<!-- 动作设置为发送的广播动作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>

运行结果:MyReceiver1得到广播数据后打印“这是初始数据”,MyReceiver2接收到广播数据打印“这是修改后的数据”,MyReceiver3没有打印。

BroadcastReceiver广播相关 - 转的更多相关文章

  1. Android 学习笔记 BroadcastReceiver广播...

    PS:不断提升自己,是件好事... 学习内容: 1.BroadcastReceiver的使用.. 2.通过BroadcastReceiver去启动Service... 1.BroadcastRecei ...

  2. Android的BroadcastReceiver 广播 短信拦截

    如何去理解BroadcastReceiver(广播)?其实可以这样想,首先我们要有一个发送广播的"媒体",在这个例子中,我们暂且用activity组件作为这个媒体,当然以后会用到s ...

  3. Android组件系列----BroadcastReceiver广播接收器

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  4. Android开发——BroadcastReceiver广播的使用

    想要了解广播定义及相关原理的可以看下这一篇BroadcastReceiver史上最全面解析 简单地对广播进行分类吧,广播有两个角色,一个是广播发送者,另外一个是广播接收者 广播按照类型分为两种,一种是 ...

  5. BroadcastReceiver广播接受者

    广播接收器的两种注册方式: 1)动态注册:在代码中注册,创建一个IntentFilter(意图过滤器)对象,设置想要就收的广播,在onCreate()方法中通过调用registerReceiver() ...

  6. Android中BroadcastReceiver广播

    BroadCastReceiver 简介 广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadca ...

  7. Android BroadcastReceiver广播接受者

    静态注册 配置清单表注册:只要曾经注册过哪怕关闭也能调用  方式一:sendBroadCastReceive   广播的步骤:       发送  无序广播,普通广播       (1).发送方    ...

  8. Android四大组件之一:BroadCastReceiver(广播接收者)

    广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...

  9. BroadcastReceiver广播接受者简单使用

    1.注册BrocadcastReceiver <receiver android:name=".FirstReceiver" > <!-- 指定能够接收的广播类型 ...

随机推荐

  1. 纯小白入手 vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

  2. FineReport中如何安装移动端H5插件

    1. HTML5报表插件安装及使用编辑 插件安装 插件网址以及设计器插件安装方法和服务器安装插件的方法可以官网上面搜索,这里就不做详细介绍了. 移动端HTML5报表使用方法 安装好插件后,在浏览器中调 ...

  3. BootStrap学习之栅格布局

    Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的改变,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mixin用于生成更具语 ...

  4. RecyclerView--添加头部和底部

    1.先构建WrapRecyclerAdapter /** * Description: 可以添加头部和底部的Adapter */ public class WrapRecyclerAdapter ex ...

  5. 网站与phpwind用户同步的方法

    搭建了一个个人网站,希望使用phpwind来完成论坛功能.但很快就发现存在用户同步的问题,我的网站已经有了用户管理功能, phpwind论坛也有.因此用户同步注册,登陆和注销是必须要实现的. 网上说可 ...

  6. apache web服务器安全配置

    尽管现在购买的云服务器很多都有一键web环境安装包,但是如果是自己配置web环境则需要对各种安全配置十分了解,今天我们就来尝试这做好web服务器安全配置.这里的配置不尽完善,若有纰漏之处还望指出. 修 ...

  7. ABP(ASP.NET Boilerplate Project)框架探讨

    从官网上下载下来带Module-Zero的abp框架. vs2015打开解决方案. 首先让系统run起来.把webconfig数据库连接改一下.启动程序. 发现报错:“本地语言指定”的错误,之后运行n ...

  8. 如何在 Azure 中标记 Windows 虚拟机

    本文介绍在 Azure 中通过 Azure 资源管理器标记 Windows 虚拟机的不同方式.标记是用户定义的键/值对,可直接放置在资源或资源组中.针对每个资源和资源组,Azure 当前支持最多 15 ...

  9. 【Weex学习】环境搭建

    教程来源:http://jspang.com/2017/07/12/weex/,我本地是第一次安装Android Studio和教程有些出入 一.软件安装 1.安装Node.js 2.安装Java(h ...

  10. PgSQL基础之 pgsql与mysql的简单区别

    1.支持的booloan类型的值 mysql并不支持boolean类型,即便当我们创建了boolean的字段属性之后,mysql会自动将其转化为tinyint(1)类型.当插入“true”的时候,其值 ...