1. 接收系统的广播步骤

(1)  新建一个类继承BroadcastReceiver

以监听sd卡状态的广播接收者为例

 1 public class SdCardBroadcastReceiver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5         String action = intent.getAction();
 6         if("android.intent.action.MEDIA_MOUNTED".equals(action)){
 7             System.out.println("sd卡已挂载");
 8         }else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
 9             System.out.println("sd卡已卸载");
10         }
11     }
12
13 }

形象一点的比喻, 这一步相当于买了个收音机

(2) 在清单文件中注册

1 <!-- 相当于装电池 -->
2         <receiver android:name="com.example.sdbroadcast.SdCardBroadcastReceiver">
3             <!-- 相当于调频道 -->
4             <intent-filter>
5                 <action android:name="android.intent.action.MEDIA_MOUNTED"/>
6                 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
7                 <data android:scheme="file"/>
8             </intent-filter>
9         </receiver>

这一步相当于装电池

(3)  在清单文件中添加意图过滤器,action里写监听的内容

1  <!-- 相当于调频道 -->
2             <intent-filter>
3                 <action android:name="android.intent.action.MEDIA_MOUNTED"/>
4                 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
5                 <data android:scheme="file"/>
6             </intent-filter>

这一步相当于调频道了

2. 发送自定义的无序广播

(1) 发送广播

 1 public void startBroadcast(View view){
 2         //开启广播
 3         //创建一个意图对象
 4         Intent intent = new Intent();
 5         //指定发送广播的频道
 6         intent.setAction("com.example.BROADCAST");
 7         //发送广播的数据
 8         intent.putExtra("key", "发送无序广播,顺便传递的数据");
 9         //发送
10         sendBroadcast(intent);
11     }

(2) 接收广播

新建一个类,继承BroadcastReceiver

 1 public class UnorderedReceiver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5         String action = intent.getAction();
 6
 7         String data = intent.getStringExtra("key");
 8
 9         System.out.println("接受到了广播,action:"+ action +",data:"+data);
10
11         //接受到了广播,action:com.example.BROADCAST,data:发送无序广播,顺便传递的数据
12     }
13
14 }

记得在清单文件中进行注册

1 <receiver android:name="com.example.selfreceiver.UnorderedReceiver">
2             <intent-filter>
3                 <action android:name="com.example.BROADCAST"/>
4             </intent-filter>
5         </receiver>

打印出的结果:

3. 发送自定义的有序广播

(1) 发送广播

 1 // 发送有序广播
 2     public void sendOrderedBroad(View view) {
 3         Intent intent = new Intent();
 4         intent.setAction("com.example.ORDERED");
 5         // 发送无序广播
 6         sendOrderedBroadcast(intent,//意图动作,指定action动作
 7                 null, //receiverPermission,接收这条广播具备什么权限
 8                 new FinalReceiver(),//resultReceiver,最终的广播接受者,广播一定会传给他
 9                 null, //scheduler,handler对象处理广播的分发
10                 0,//initialCode,初始代码
11                 "每人发10斤大米,不得有误!", //initialData,初始数据
12                 null//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据
13                 );
14     }

在上面的代码中,广播发送者发送了一条广播:"每人发10斤大米,不得有误!"

(2) 接收广播

新建一个类, 继承BroadcastReceiver,并在清单文件中进行注册

以下是所有的广播接收者在清单文件中的注册

权限从-1000 至 1000

1) 权限高的广播接收者可以修改广播,甚至可以终止广播

权限高的广播接收者1:

 1 public class ShengReceiver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5
 6         //获取广播的数据
 7         String data = getResultData();
 8
 9         //修改
10         setResultData("中央下达福利,每人5斤大米");
11
12         System.out.println("省政府收到指示, data : "+data);
13     }
14
15 }

在这里, 这个接收者修改广播为: "中央下达福利,每人5斤大米"

权限低的广播接收者

 1 public class PeopleReceiver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5         //获取广播的数据
 6         String data = getResultData();
 7         System.out.println("老百姓收到福利,感谢党, data : "+data);
 8     }
 9
10 }

这样,在控制台打印出来的信息为:

权限低的接收者 接收到的广播就是修改后的了

2) 终止广播

权限高的广播接收者:

 1 public class ShengReceiver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5
 6         //获取广播的数据
 7         String data = getResultData();
 8
 9         //也可以终止广播,权限小的接收者就接收不到广播了
10         abortBroadcast();
11
12         System.out.println("省政府收到指示, data : "+data);
13     }
14
15 }

控制台打印:

权限小的就接收不到广播了....

(3) resultReceiver

可以在广播发送者的应用中建一个resultReceiver, 用于接收最终到达的广播,

无论广播是否终止,都会被resultReceiver接收

1 public class FinalReceiver extends BroadcastReceiver {
2
3     @Override
4     public void onReceive(Context context, Intent intent) {
5         String resultData = getResultData();
6         System.out.println("人民收到的最终福利是: "+ resultData);
7     }
8
9 }

控制台打印信息:

(终止广播后):

(修改广播后):

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);

转载于:https://www.cnblogs.com/wanghaoyuhappy/p/5292733.html

Android中广播接收者BroadcastReceiver详解相关推荐

  1. Android面试基础之BroadcastReceiver详解(斗帝养成系列四)

    斗帝养成 大斗师,一至九星,斗气铠甲,斗气外放,聚气化固态,呈菱形.别说自己尽力了,那只是自欺欺人的假话. Android面试基础之Activity详解(斗帝养成系列一) Android面试基础之Se ...

  2. Android中的四大组件详解

    Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity.Service.BroadcastReceiver.Conte ...

  3. android studio parcelable,Android中Parcelable的使用详解

    Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口. Parcelable是Android为我们提供的序列化的接口. 对比: 1.Pa ...

  4. android 无法接收广播_别告诉我你不认识Android中广播接收者(二)

    前面我们了解了什么是广播接收者与广播接收者的创建,这一次我们要接着继续去了解广播接收者的相关知识,这些知识包括广播接收者的注册.自定义广播与广播的类型. 当我们学习完广播接收者之后,该如何才能让它起到 ...

  5. RxJava操作符在android中的使用场景详解(一)

    转载请注明出处:http://www.wangxinarhat.com/2016/04/19/2016-04-19-rxjava-android-operate1/ 最近学习了RxJava在andro ...

  6. android token机制_对Android 中的 ANR 进行详解

    前言 关于ANR,以前只知道Activity.BroadCastReceiver.Service三种组件的ANR时限.一般采用哪些方式避免ANR.以及通过data/anr/traces.txt去分析A ...

  7. Android中图片压缩方案详解

    如感觉排版不舒服,可移步至此处查看 图片的展示可以说在我们任何一个应用中都避免不了,可是大量的图片就会出现很多的问题,比如加载大图片或者多图时的OOM问题,可以移步到Android高效加载大图.多图避 ...

  8. Android中LayoutParams类精炼详解

    一.前期基础知识储备 首先看几个使用LayoutParams的实例: 1.<Android开发艺术探索>第8章,Java代码中动态设置按钮时 通过LayoutParams参数设置按钮位置x ...

  9. Android中R.java文件详解

    R.java文件有两种,两种文件作用一样都是获取资源的引用,区别在于一个存放着我们写的项目中资源的引用,另一个存放着系统定义好的一些资源 1.1 项目的R.java文件 先说第一种是项目编译出来的R. ...

最新文章

  1. ECharts 饼图绘制教程
  2. 国际泰斗:现在谈强人工智能为时尚早
  3. jpa多条件查询重写Specification的toPredicate方法(转)
  4. Linux中的进程创建函数fork
  5. python_目录结构
  6. Linux centos7 VMware Apache访问日志不记录静态文件、访问日志切割、静态元素过期时间...
  7. SAP CRM Enterprise search后退按钮的实现
  8. Java面向对象基础接口和抽象的理解
  9. [5] ADB 与应用交互
  10. 阿里云MVP乔帮主:五大类型负载均衡的原理场景详解(文末赠书)
  11. ScrollView滑动控制
  12. 网络爬虫详细设计方案
  13. 悲剧的购物经历(附:最好不要买响尾蛇3G)
  14. 钉钉实时拍照和上传图片
  15. 20行Python小程序批量删除GitHub仓库,包
  16. 系分 - 案例分析 - 需求分析
  17. lambda表达式——捕获
  18. 电脑使用cmd发送邮件——以QQ邮件为例
  19. 如何卸载windows服务
  20. 1.屏幕分类和刘海屏的适配原则

热门文章

  1. java中写入文件的方法
  2. Redis 10亿数据量只需要100MB内存,为什么这么牛?
  3. 从来没有一种技术是为了解决复用、灵活组合、定制开发的问题
  4. 深入Lock锁底层原理实现,手写一个可重入锁
  5. 理清 WebSocket 和 HTTP 的关系
  6. Google MapReduce架构设计
  7. 干货 | 解决分布式场景下数据一致性问题,我有办法!
  8. Alpine Linux 使用简介
  9. Hystrix文档-实现原理
  10. Spring Boot怎么样注册Servlet三大组件[Servlet、Filter、Listener]