Android中广播接收者BroadcastReceiver详解
1. 接收系统的广播步骤
(1) 新建一个类继承BroadcastReceiver
以监听sd卡状态的广播接收者为例
public class SdCardBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("android.intent.action.MEDIA_MOUNTED".equals(action)){
System.out.println("sd卡已挂载");
}else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
System.out.println("sd卡已卸载");
}
}
}
形象一点的比喻, 这一步相当于买了个收音机
(2) 在清单文件中注册
<!-- 相当于装电池 -->
<receiver android:name="com.example.sdbroadcast.SdCardBroadcastReceiver">
<!-- 相当于调频道 -->
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>
这一步相当于装电池
(3) 在清单文件中添加意图过滤器,action里写监听的内容
<!-- 相当于调频道 -->
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file"/>
</intent-filter>
这一步相当于调频道了
2. 发送自定义的无序广播
(1) 发送广播
public void startBroadcast(View view){
//开启广播
//创建一个意图对象
Intent intent = new Intent();
//指定发送广播的频道
intent.setAction("com.example.BROADCAST");
//发送广播的数据
intent.putExtra("key", "发送无序广播,顺便传递的数据");
//发送
sendBroadcast(intent);
}
(2) 接收广播
新建一个类,继承BroadcastReceiver
public class UnorderedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String data = intent.getStringExtra("key");
System.out.println("接受到了广播,action:"+ action +",data:"+data);
//接受到了广播,action:com.example.BROADCAST,data:发送无序广播,顺便传递的数据
}
}
记得在清单文件中进行注册
<receiver android:name="com.example.selfreceiver.UnorderedReceiver">
<intent-filter>
<action android:name="com.example.BROADCAST"/>
</intent-filter>
</receiver>
打印出的结果:

3. 发送自定义的有序广播
(1) 发送广播
// 发送有序广播
public void sendOrderedBroad(View view) {
Intent intent = new Intent();
intent.setAction("com.example.ORDERED");
// 发送无序广播
sendOrderedBroadcast(intent,//意图动作,指定action动作
null, //receiverPermission,接收这条广播具备什么权限
new FinalReceiver(),//resultReceiver,最终的广播接受者,广播一定会传给他
null, //scheduler,handler对象处理广播的分发
0,//initialCode,初始代码
"每人发10斤大米,不得有误!", //initialData,初始数据
null//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据
);
}
在上面的代码中,广播发送者发送了一条广播:"每人发10斤大米,不得有误!"
(2) 接收广播
新建一个类, 继承BroadcastReceiver,并在清单文件中进行注册
以下是所有的广播接收者在清单文件中的注册

权限从-1000 至 1000
1) 权限高的广播接收者可以修改广播,甚至可以终止广播
权限高的广播接收者1:
public class ShengReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的数据
String data = getResultData();
//修改
setResultData("中央下达福利,每人5斤大米");
System.out.println("省政府收到指示, data : "+data);
}
}
在这里, 这个接收者修改广播为: "中央下达福利,每人5斤大米"
权限低的广播接收者
public class PeopleReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的数据
String data = getResultData();
System.out.println("老百姓收到福利,感谢党, data : "+data);
}
}
这样,在控制台打印出来的信息为:

权限低的接收者 接收到的广播就是修改后的了
2) 终止广播
权限高的广播接收者:
public class ShengReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的数据
String data = getResultData();
//也可以终止广播,权限小的接收者就接收不到广播了
abortBroadcast();
System.out.println("省政府收到指示, data : "+data);
}
}
控制台打印:

权限小的就接收不到广播了....
(3) resultReceiver
可以在广播发送者的应用中建一个resultReceiver, 用于接收最终到达的广播,
无论广播是否终止,都会被resultReceiver接收
public class FinalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
System.out.println("人民收到的最终福利是: "+ resultData);
}
}
控制台打印信息:
(终止广播后):

(修改广播后):

4. 补充:
有序广播和无序广播的区别:
有序广播:发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;Context.sendBroadcast(intent);
有序广播:广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);
Android中广播接收者BroadcastReceiver详解的更多相关文章
- Android中Service的使用详解和注意点(LocalService)
Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...
- Android中SurfaceView的使用详解
Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...
- Android中的windowSoftInputMode属性详解
这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下 在前面的一篇文章中 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- Android中Application类的详解:
Android中Application类的详解: 我们在平时的开发中,有时候可能会须要一些全局数据.来让应用中的全部Activity和View都能訪问到.大家在遇到这样的情况时,可能首先会想到自定义一 ...
- Android 中的消息传递,详解广播机制
--------------------------------------广播机制简介--------------------------------------------- Android中的广 ...
- Android中的sharedUserId属性详解
在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...
- Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- Android中数据库的操作流程详解
Android中数据库的操作方法: 1.Android平台提供了一个数据库辅助类来创建或打开数据库. 这个辅助类继承自SQLiteOpenHelper类.继承和扩展SQLiteOpenHelper类主 ...
随机推荐
- Sightseeing trip POJ - 1734 -Floyd 最小环
POJ - 1734 思路 : Floyd 实质 dp ,优化掉了第三维. dp [ i ] [ j ] [ k ] 指的是前k个点优化后 i -> j 的最短路. 所以我们就可以 ...
- powershell_基础篇
powershell 想必大家对windows操作系统下的cmd命令提示符可能并不陌生,大多数人都应该使用过它.而对于今天我们要学习的PowerShell跟cmd有什么关系呢?可以简单地说,Power ...
- Codechef April Challenge 2019 游记
Codechef April Challenge 2019 游记 Subtree Removal 题目大意: 一棵\(n(n\le10^5)\)个结点的有根树,每个结点有一个权值\(w_i(|w_i\ ...
- mysql5.7.X版本only_full_group_by问题解决
一.出错原因 最近因为开发数据库与部署数据库版本不同,带来了几个问题,其中only_full_group_by问题是之前没有遇到的. 具体报错如下 [Err] 1055 - Expression #1 ...
- Hibernate 检索方式之 HQL 检索方式
HQL(Hibernate Query Language) 是面向对象的查询语言,它和 SQL 查询语言有些相似.在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式,它有如 ...
- 登录RabbitMQ的方法
一:(运行RabbitMQ之前需要先打开docker 容器)打开相应的路径,在windows Powershell 管理员下打开 输入:docker-compose -f .\docker-compo ...
- python学习:列表
列表 a = ['abc','bcd','cde','def','efg']print(a)列表的操作:增删改查 1)查:切片print(a[1:3]) #从'bcd'取到'cde',列表取值顾头不顾 ...
- docker 数据卷管理
在生产环境中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这涉及到容器对数据管理的操作 容器对数据的管理主要有两种方式: 数据卷(Data Volumes): 容器内 ...
- codeforces 13 D
给你500个红点和蓝点,让你找多少点红点构成的三角形里没有蓝点. 巧妙啊!我们考虑一个很远位置的点,不妨设这个为O,然后n^2枚举红点,考虑Oij里面蓝点的个数, 然后 对于 ijk这个三角形,我们可 ...
- 把一下程序中的print()函数改写成
源代码: #include <iostream> using namespace std; void print( int w ) { ; i <= w ; i++ ) { ; j ...