android四大组件之Broadcast
- 广播的概念
- 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听
- Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件。Android系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发短信、拨打电话、屏幕解锁
广播接收者的注册
Android四大组件都要在清单文件中注册
广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册
有的广播接收者,必须代码注册如 电量改变,屏幕锁屏和解锁
使用清单文件配置
<receiver android:name="接收广播的实现类所在的包">
<intnt-filter>
<android:name="要接收的广播">
<android:data="">
......
</intent-filter>
</receiver>
通过代码的实现
//创建广播接收者对象
receiver = new ScreenOnOffReceiver();
//通过IntentFilter对象指定广播接收者接收什么类型的广播
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
//注册广播接收者
registerReceiver(receiver, filter);
解除注册广播接收者 解除注册之后,广播接收者将失去作用
unregisterReceiver(receiver);
- 为什么
广播的接收
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast
/sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
实现一个BroadcastReceiver 接收BroadCast发送的广播
需求:监听用户拨打电话,在用户拨打电话号码前自动加上17951等
拦截的广播:
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
需要的权限:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
1.新创建一个Android工程《IPCaller》
2.在src目录下新创建一个类IPCallerReceiver继承BroadcastReceiver,重写OnReceive方法。
public class IPCallReveiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取拨打的电话号码
String resultData = getResultData();
//在电话号码前加上17951,然后返回数据
setResultData("17951"+resultData);
}
}
3.在AndroidManifest.xml中注册广播接收者
<receiver android:name="com.itheima.ipcaller.IPCallReveiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
</intent-filter>
</receiver>
在下面的配置文件中 <intent-filter android:priority="1000">属性代表着给当前接收者设置优先级,优先级越高越优先接收到广播(只有有序广播注册才有效)
运行上面的代码,然后拨打电话5556,发现拨出去的号码已经变为179515556。 运行效果图如下:

发送自定义广播
发送无序广播
- 无序广播不可以被拦截,如果被拦截的话会报错:
- 无序广播可以视为所有广播接收者同时接收到广播
无序广播使用sendBroadcast方法来发送
public void sendBroadcast(View view){
//定义一个意图
Intent intent = new Intent();
//设置Action 可以接受到该广播的意图过滤器
intent.setAction("com.itheima.broadcast");
//绑定数据
intent.putExtra("data", "我是无序广播数据");
//发送无序广播
sendBroadcast(intent);
}
发送有序广播
- 有序广播可以被拦截,且优先级搞得接收者可以拦截优先级低的
- 广播接受者的优先级的取值范围是:1000(最高)~ -1000(最低)
- 相同的优先级下,接收的顺序要看清单文件中的声明顺序,先声明先接收广播
- 有序广播使用sendOrderedBroadcast()方法发送,可以使用abortBroadcast()方法拦截 *广播接收者的优先级可以在清单文件中声明接收者时,在<intent-filter>标签下通过设置“android:property”属性来设置
我们新创建一个项目,来演示无序广播的发送和接收过程
- 新创建一个Android工程《广播发送和接收》,包名com.itheima.broadcastAndreceiver
2.在默认的MainActivity的布局中添加一个按钮,绑定事件,该事件的核心功能是发送一个有序广播,MainActivity类代码清单如下:
public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendOrder(View view) {
// 意图
Intent intent = new Intent();
//定义动作
intent.setAction("com.itheima.data");
//发送有序广播
//第一个参数 Intent类型:意图
//第二个参数 String类型 receiverPermission,接收器需要的权限
//第三个参数BroadcastReceiver类型,自己定义的接收器作为最终接收器
//第四个参数Handler类型,用于执行接收器的回调,如果为null则在主线程中执行
//第五个参数int类型,结果代码的初始码
//第六个参数初始化参数
//第七个参数Bundle类型,额外的数据
sendOrderedBroadcast(intent, null, null,
null, RESULT_OK, "1万元钱", null);
}
3.分别编写MyReceiver和MyReceiver2类,继承BroadcastReceiver类
MyReceiver类代码清单:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show();
System.out.println("MyReceiver接收到"+action+"发布的广播:"+resultData);
}
}
MyReceiver2类代码清单:
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver2接收到"+action+"发布的广播:"+resultData, 1).show();
System.out.println("MyReceiver2接收到"+action+"发布的广播:"+resultData); }
}
4.在AndroidManifest.xml中注册MyReceiver和MyReceiver2:
<receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver">
<intent-filter android:priority="1000">
<action android:name="com.itheima.data"></action>
</intent-filter>
</receiver>
<receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver2">
<intent-filter android:priority="-1000">
<action android:name="com.itheima.data"></action>
</intent-filter>
</receiver>
在上面清单文件中我们给MyReceiver设置了最高优先级1000,给MyReceiver2设置了最低优先级-1000。
5.下面我们分多钟情况,分别演示有序广播的接收规律
直接部署上面的工程到模拟器,点击发送广播按钮,控制台结果为:

6.修改MyReceiver类的代码:在onReceive方法中添加abortBroadcast()方法,
public class MyReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show();
System.out.println("MyReceiver接收到"+action+"发布的广播:"+resultData);
abortBroadcast();
}
}
然重新部署该工程,运行,点击发送广播按钮。这时控制台打印信息为

这说明优先级高的的广播接收者可以修改或拦截广播 优先级低的广播接收者收到修改后的广播或收不到广播
7.在第二种情况的基础上,我们修改MainActivity类中sendOrder方法,修改sendOrderedBroadcast中第三个参数,指定一个最终接收器
public void sendOrder(View view) {
// 意图
Intent intent = new Intent();
intent.setAction("com.itheima.data");
sendOrderedBroadcast(intent, null, new MyReceiver2(),
null, RESULT_OK, "1万元钱", null);
}
运行上面的项目,我们可以控制台输出如下信息:

虽然在MyReceiver中我们调用了abortBroadcast();方法,但是广播依然被MyReceiver2接收到。原因是我们在sendOrderedBroadcast方法中指定了MyReceiver2接收器为最终接收器,因此该广播被终止的时候MyReceiver2接收器依然可以接收到广播。
8.在第3种情形的基础上,我们修改MyReceiver类,我们将该类中的onReceive方法中的abortBroadcast();方法去掉。然后运行上面工程。发现控制台输入如下信息

我们发现MyReceiver第一个接收到广播,MyReceiver2第二个接收到广播,然后MyReceiver2又接收到一次广播。对的,结果确实是这样,因为我们在sendOrderedBroadcast方法中,将MyReceiver2作为最终接收器,那么我们发出的广播会被所有符合条件的接收器接收,最后指定的最终接收器不管是否已经接收过信息依然会再次接收。
android四大组件之Broadcast的更多相关文章
- [Android基础]Android四大组件之BroadCast
BroadCast的定义: 广播是一种订阅--通知 事件,广播接收者向Android系统 register (订阅广播),广播发送者向Adnroid系统 sendBroadCast(发送广播),然后A ...
- 【Android开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver
广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都 ...
- Android 四大组件之broadcast的理解
Android广播的两种类型: 1.静态广播 2.动态广播 静态注册广播: Manifeast中的代码块: <receiver android:name=".broadcast.MyS ...
- Android四大组件之BroadCast(续)
1.哪一个方法可以发送广播? activity.sendbroadcast or context.sentbroadcast or service.sendbroadcast 2.创建广播接受程序必须 ...
- Android 四大组件之service与Broadcast
Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...
- Android四大组件之一“广播”
前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...
- android四大组件(简单总结)
activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...
- 第九章:四大组件之Broadcast Receiver
第九章:四大组件之Broadcast Receiver 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...
- Android四大组件小结
Android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...
随机推荐
- C算法编程题(七)购物
前言 上一篇<C算法编程题(六)串的处理> 有些朋友看过我写的这个算法编程题系列,都说你写的不是什么算法,也不是什么C++,大家也给我提出用一些C++特性去实现问题更方便些,在这里谢谢大家 ...
- Lua 学习笔记(六)迭代器
一.迭代器的定义 “迭代器”就是一种可以遍历一种集合中所有元素的机制.在Lua中迭代器以函数的形式表示,即没掉用一次函数,即可返回集合中的“下一个”元素.迭代器的实现可以借助于闭合函数实现, ...
- 修正IE6不支持position:fixed的bug(转)
众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著.前些天我做自己的博客模板的时候,遇到了这个问题.当时就简单的无视了IE6— ...
- SQLServer学习笔记系列12
一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...
- gnuplot: 一种更为简洁的曲线,柱状图绘图软件
gnuplot: 一种更为简洁的曲线,柱状图绘图软件 gnuplot: 一种更为简洁的曲线,柱状图绘图软件 Zhong Xiewei Wed Jun 25 gnuplot简单介绍 关于gnuplot的 ...
- Command and Query Responsibility Segregation (CQRS) Pattern 命令和查询职责分离(CQRS)模式
Segregate operations that read data from operations that update data by using separate interfaces. T ...
- Struts2 源码分析——Action代理类的工作
章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...
- 关于dijkstra算法的一点理解
最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...
- browserCaps与浏览器功能设置
使用 Web.config 文件中的 browserCaps 元素来定义浏览器的行为在 .NET Framework 2.0 中被否决,但仍受支持.此元素中的数据与浏览器定义文件 (.browser) ...
- C# 之 DataReader 和 DataSet 的区别
本文转载自:http://www.cnblogs.com/xinaixia/p/4920630.html 1. 获取数据的方式[1]DataReader 为在线操作数据, DataReader会一直占 ...