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详解的更多相关文章

  1. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

  2. Android中SurfaceView的使用详解

    Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...

  3. Android中的windowSoftInputMode属性详解

    这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下     在前面的一篇文章中 ...

  4. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  5. Android中Application类的详解:

    Android中Application类的详解: 我们在平时的开发中,有时候可能会须要一些全局数据.来让应用中的全部Activity和View都能訪问到.大家在遇到这样的情况时,可能首先会想到自定义一 ...

  6. Android 中的消息传递,详解广播机制

    --------------------------------------广播机制简介--------------------------------------------- Android中的广 ...

  7. Android中的sharedUserId属性详解

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...

  8. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  9. Android中数据库的操作流程详解

    Android中数据库的操作方法: 1.Android平台提供了一个数据库辅助类来创建或打开数据库. 这个辅助类继承自SQLiteOpenHelper类.继承和扩展SQLiteOpenHelper类主 ...

随机推荐

  1. 用DFS求连通块(种子填充)

    [问题] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分 ...

  2. SpringBoot使用Sharding-JDBC读写分离

    本文介绍SpringBoot使用当当Sharding-JDBC进行读写分离. 1.有关Sharding-JDBC 本文还是基于当当网Sharding-Jdbc的依赖,与上一篇使用Sharding-Jd ...

  3. libevent入门介绍

    libevent是之前看到的一个别人推荐的清凉级网络库,我就想了解一下它.今天下载到了一个人写的剖析系列,从结构和源码方面进行了简要分析.只是这个分析文章是2010年的,有点过时了(跟现在的libev ...

  4. [LeetCode] Smallest Subtree with all the Deepest Nodes 包含最深结点的最小子树

    Given a binary tree rooted at root, the depth of each node is the shortest distance to the root. A n ...

  5. [LeetCode] Loud and Rich 聒噪与富有

    In a group of N people (labelled 0, 1, 2, ..., N-1), each person has different amounts of money, and ...

  6. Centos7 编译安装 Nginx Mariadb Asp.net Core2 (实测 笔记 Centos 7.3 + Openssl 1.1.0h + Mariadb 10.3.7 + Nginx 1.14.0 + Asp.net. Core 2 )

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 安装步骤: 1.准备 1.0 查看硬 ...

  7. Cordova/Ionic Android 开发环境搭建 - Windows系统

        电脑操作系统 - windows 10 IDE - WebStorm 2019 Node v10.15.3 npm v6.4.1 Ionic v3 Angula v5 Cordova 移动设备 ...

  8. cadence焊盘及元件封装制作

    前面学习了元件封装的制作,由于琐碎事情的耽误,加上学习python,没有及时的总结这部分内容,现在做一个补充!

  9. nodejs内存溢出

    npm-v 报错,错误信息如下: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScri ...

  10. 最基础的Eureka服务和注册搭建

    Eureka服务端 打开IDEA,新建项目 选择"next",写上组织名(Group)和项目名(Artifact) 选择如下选项,然后一直下一步,创建好项目. 删除不必要的文件 添 ...