一、前言

今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低、开机、锁屏等一些操作都会发送一个广播。

二、广播机制

广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。

普通广播(Normal broadcasts):
普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;
有序广播(Ordered broadcasts):
有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。
Context.sendBroadcast()
发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast()
发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。

广播接收:
广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。要实现一个广播接收者方法如下:
第一步:定义广播接收者,继承BroadcastReceiver,并重写onReceive()方法。

public class BroadCast extends BroadcastReceiver {@Override public void onReceive(Contextcontext, Intentintent) {}
}

第二步: 注册广播Intent,方法有两种:
第一种:使用代码进行订阅(动态注册)

IntentFilter filter = new IntentFilter("com.llay.admin.mydemo.sendMessage");
BroadCast receiver = new BroadCast ();
registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的节点里进行订阅(静态注册)

<receiver android:name=".BroadCast"><intent-filter><action android:name="com.llay.admin.mydemo.sendMessage"/></intent-filter>
</receiver>

注意:

静态订阅广播又叫:常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到,他的注册方式就是在你的应用程序中的AndroidManifast.xml进行订阅的。
动态订阅广播又叫:非常驻型广播,当应用程序结束了,广播自然就没有了,比如你在activity中的onCreate或者onResume中订阅广播,同时你必须在onDestory或者onPause中取消广播订阅。不然会报异常,这样你的广播接收器就一个非常驻型的了。

三、代码的实现(使用Intent启动广播,可以显示启动,也可以隐示启动,这里显示启动忽略)

3、1 普通广播(Normal broadcasts)

(静态注册)
1、布局界面:

2、广播代码
NormalBroadCast.java文件,用来接收activity中发送的数据

public class NormalBroadCast extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String s = intent.getStringExtra("xiaomi");Log.e("NormalBroadCast", s);}
}

3、activity中的代码

String s = editNormal.getText().toString();
//Intent intent = new Intent(BroadcastReceiverActivity.this, NormalBroadCast.class);//显示启用广播
Intent intent1 = new Intent("com.llay.admin.mydemo.sendMessage");
intent1.putExtra("xiaomi", s);
sendBroadcast(intent1);
break;

4、AndroidManifests.xml文件中静态注册该广播

<receiver android:name="com.llay.admin.broadcast.NormalBroadCast"><intent-filter><action android:name="com.llay.admin.mydemo.sendMessage" /></intent-filter></receiver>

结果:运行结果图:
输入文字,点击发送广播按钮:

(动态注册注册)
1、布局界面同上
2、广播代码同上
3、Actvity中代码

public class BroadcastReceiverActivity extends AppCompatActivity implements View.OnClickListener {private EditText editNormal;private Button buttonNormal, buttonOrdered;NormalBroadCast normalBroadCast;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broadcast_receiver);init();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("com.llay.admin.mydemo.sendMessage");normalBroadCast = new NormalBroadCast();registerReceiver(normalBroadCast, intentFilter);Log.e("xiaomi", "注册广播");}private void init() {editNormal = (EditText) findViewById(R.id.normal_edit);buttonNormal = (Button) findViewById(R.id.normal_button);buttonOrdered = (Button) findViewById(R.id.ordered_button);buttonNormal.setOnClickListener(this);buttonOrdered.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.normal_button:String s = editNormal.getText().toString();//Intent intent = new Intent(BroadcastReceiverActivity.this, NormalBroadCast.class);//显示启动广播Intent intent1 = new Intent("com.llay.admin.mydemo.sendMessage");intent1.putExtra("xiaomi", s);sendBroadcast(intent1);break;}}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(normalBroadCast);Log.e("xiaomi", "取消广播");}

注意:动态注册广播的时候,必须要你在activity中的onCreate或者onResume中订阅广播,同时你必须在onDestory或者onPause中取消广播订阅。
4、AndroidManifest.xml中注册广播

<receiver android:name="com.llay.admin.broadcast.NormalBroadCast">
</receiver>

结果:运行结果图:
输入文字,点击发送广播按钮:

3、2 有序广播(Ordered broadcasts)

注意:这里我就直接用静态注册广播了,这也是推荐使用的。因为动态注册会随应用的关闭而消失。
1、布局文件同上
2、广播代码
A广播:
OrderedBroadCastA.java文件:

public class OrderedBroadCastA extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String s = intent.getStringExtra("xiaomi");Log.e("orderedA", s);//终止Ordered广播传递
//        abortBroadcast();Bundle bundle = new Bundle();bundle.putString("传递给下一个广播", "ss");setResultExtras(bundle);}

注意:其中广播A可以使用abortBroadcast()来使得传递给下一个的广播终止,使用setResultExtras()来将数据从此广播传递给下一个广播。

3、Actvity中代码

String s1 = editNormal.getText().toString();
Intent intent2 = new Intent("com.llay.admin.mydemo.sendMessage");
intent2.putExtra("xiaomi", s1);
sendOrderedBroadcast(intent2, null);
break;

4、AndroidManifest.xml中注册广播

<!--优先级高--><receiver android:name="com.llay.admin.broadcast.OrderedBroadCastA"><intent-filter android:priority="2"><action android:name="com.llay.admin.mydemo.sendMessage" /></intent-filter></receiver><!--优先级低--><receiver android:name="com.llay.admin.broadcast.OrderedBroadCastB"><intent-filter android:priority="1"><action android:name="com.llay.admin.mydemo.sendMessage" /></intent-filter></receiver>

注意:这里都是采用的是静态的注册广播的方式,android:priority属性是设置优先级,数字越大,优先级越高,越会先执行。

结果:运行结果图:
输入文字,点击发送广播按钮
此处A广播中使用abortBroadcast();方法

此处A广播不使用abortBroadcast();方法

BroadCastReceive的理解和使用相关推荐

  1. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  2. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

  3. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  4. java局部变量全局变量,实例变量的理解

    java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...

  5. 智能文档理解:通用文档预训练模型

    预训练模型到底是什么,它是如何被应用在产品里,未来又有哪些机会和挑战? 预训练模型把迁移学习很好地用起来了,让我们感到眼前一亮.这和小孩子读书一样,一开始语文.数学.化学都学,读书.网上游戏等,在脑子 ...

  6. 熵,交叉熵,散度理解较为清晰

    20210511 https://blog.csdn.net/qq_35455503/article/details/105714287 交叉熵和散度 自己给自己编码肯定是最小的 其他的编码都会比这个 ...

  7. mapreduce理解_大数据

    map:对不同的数据进行同种操作 reduce:按keys 把数据规约到一起 看这篇文章请出去跑两圈,然后泡一壶茶,边喝茶,边看,看完你就对hadoop 与MapReduce的整体有所了解了. [前言 ...

  8. 文件句柄和文件描述符的区别和理解指针

    句柄是Windows用来标识被应用程序所建立或使用的对象的唯一整数,Windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.Windows句柄有点象C语言中的文件句柄. ...

  9. 通俗理解条件熵-数学

    就是决策树里面选划分属性用到的计算 条件熵越小表示划分之后各个集合越纯净 前面我们总结了信息熵的概念通俗理解信息熵 - 知乎专栏,这次我们来理解一下条件熵. 我们首先知道信息熵是考虑该随机变量的所有可 ...

  10. 通俗理解tf.nn.conv2d() tf.nn.conv3d( )参数的含义 pytorhc 卷积

    20210609 例如(3,3,(3,7,7))表示的是输入图像的通道数是3,输出图像的通道数是3,(3,7,7)表示过滤器每次处理3帧图像,卷积核的大小是3 x 7 x 7. https://blo ...

最新文章

  1. 去掉[]中的英文(正则表达式)C#
  2. Android开发--图形图像与动画(三)--Animation效果的XML实现
  3. Java时间和时间戳的相互转换
  4. 433M无线串口E30-TTL-100在农业物联网上的应用
  5. 1.13 编程基础之综合应用 47 大整数除法方法 python
  6. oracle 证书编号,说说Oracle的rowid
  7. 【Elasticsearch】 es 索引 内置 字段 _source
  8. linux系统开机grub命令修复方法,linux系统GRUB修复
  9. jabber服务器搭建
  10. AM3352 bootloader引导程序开发
  11. 质谱的工作原理及发展史
  12. 右上角的引用文献格式_论文标注参考文献格式
  13. 【工作小技巧】cmd 批量移动文件
  14. 报错——xxx is not defined
  15. 利用自定义注解,统计方法执行时间
  16. python mqtt publish_mqtt异步publish方法
  17. 【vpn异地组网专题】linux(centos7)安装 PPTP服务器
  18. 中国市场 Android App 兼容性报告
  19. 关于Jboot读取不到配置文件
  20. springboot毕设项目宠物领养平台f2308(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 一个程序,让你清楚区分二进制文件和文本文件
  2. Linux内核学习笔记(一)CFS完全公平调度类
  3. 从泰勒展开到牛顿迭代
  4. java 中== equals hashcode源码剖析
  5. NYOJ题目79-拦截导弹(最长递减子序列)
  6. AP计算机科学内容HTML,3分钟读懂AP计算机科学原理和计算机科学A的区别!
  7. 在python中对文件操作的一般步骤是_文件操作(一) 笔记------python
  8. php正则说明,php正则说明
  9. mysql表分片语法,分布式事务数据库HotDB的HINT特色语法
  10. 人人讲思政 门门谈育人文章计算机专业,材有新闻|我院开展“课程门门有思政,教师人人讲育人”大讨论活动...