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

news/2024/7/7 19:28:49

前面我们了解了什么是广播接收者与广播接收者的创建,这一次我们要接着继续去了解广播接收者的相关知识,这些知识包括广播接收者的注册、自定义广播与广播的类型。

ba0cc0c19a7748d336ea5cd43204f489.png

当我们学习完广播接收者之后,该如何才能让它起到作用呢?还有广播接收者是用来接收广播的?那这些接收到的广播可以自己定义吗?广播有分类吗?

这一连串的问题,让我们是不是有点头大?接下来,就带大家一起来解开这些疑惑。

第1点 自定义广播

Android系统中自定义了很多类型的广播,当系统提供的广播不能满足实际需求时,可以自定义广播,同时需要编写对应的广播接收者。

接下来通过一个图例来演示自定义广播的发送与接收过程,如下图这样。

2f865197ea5834634cd288d0ef91eba2.png

由上图我们可以看到,当自定义广播发送消息时,会将消息存储到公共消息区中,而公共消息区中如果存在对应的广播接收者,则会及时接收这条信息。广播的这种机制可以处理程序中信息的传递功能。

第2点 广播的类型

Android系统中提供了两种广播类型,分别是有序广播和无序广播,开发者可根据需求为程序设置不同的广播类型,接下来针对这两种广播类型进行介绍。

1.无序广播

无序广播是完全异步执行的,发送广播时,所有监听这个广播的广播接收器都会接收到此广播消息,但接收和执行的顺序不确定。

无序广播的效率比较高,但无法被拦截,工作流程如下图这样。

bd26b2807dcef84d2bc29fe364740374.png

由上图可知,当发送一条广播时,所有的广播接收者都会接收。

2.有序广播

有序广播是按照广播接收者声明的优先级别被依次接收,发送广播时,只会有一个广播接收者能够接收此消息,当在此广播接收者中逻辑执行完毕之后,广播才会继续传递。

相比无序广播,有序广播的广播效率较低,但此类型是有先后顺序的,并可被拦截,工作流程如下图这样。

5058b09fb21e2efd5352e6d35bcbd61c.png

由上图可知,当有序广播发送消息时,优先级最高的广播接收者最先接收,优先级最低的最后接收。如果优先级最高的广播接收者将广播终止,那么广播将不再向后传递。

第3点 广播接收者的注册

如果想要接收到一个广播消息,则需要在程序中注册接受该广播的广播接收者,广播接收者的注册有两种方式,分别为动态注册和静态注册。接下来,针对这两种注册方式进行详细的讲解。

1.动态注册

由于动态注册是在Activity中通过代码注册广播接收者,所以在MainActivity中动态注册广播接收者MyBroadcastReceiver的代码如下方这样。

ad4f1d2a4cde5a93338bff9b5a0e55e4.png

上述代码中,第9行代码创建了广播接收者实例,第12~13行代码实例化过滤器,并通过addAction()方法设置要过滤的action。

第14行代码通过registerReceiver()方法注册广播接收者,该方法中的第1个参数receiver表示广播接收者,第2个参数intentFilter表示实例化的过滤器。

第16~20行代码重写了onDestroy()方法,在该方法中通过unregisterReceiver()方法注销广播接收者MyBroadcastReceiver。

需要注意的是,动态注册的广播接收者是否被注销依赖于注册广播的组件,例如在Activity中注册了广播接收者,当Activity销毁时,广播接收者也随之被注销。

7958c06298e49da1040bde8c4fea57e2.png

2.静态注册

静态注册是在清单文件中通过配置广播接收者完成注册的。

通过第二种方式创建完广播接收者之后,Android Studio会自动在AndroidManifest.xml文件中进行静态注册创建的广播接收者,静态注册广播接收者的代码如下面这样。

808c79526c67474613e8cc18947d5851.png

根据上述代码可知,在标签中添加了一个标签,该标签中的name属性值是要注册的广播接收者,属性enabled的值为true,表示广播接收者可以由系统实例化,属性exported的值为true表示可以接收当前程序之外的广播。

此种设置就是静态注册广播接收者,这种静态注册的特点是无论应用程序是否处于运行状态,广播接收者都会对程序进行监听。

需要注意的是,在Android 8.0之后,使用静态注册的广播接收者将无法接收到广播,当发送广播时,Android系统的提示信息像下方这样。

679acc0473099b38539e0b3b351bd155.png

好了,今天已经将广播接收者的相关知识讲解完毕,如果大家有其他想法可以随时给出建议,今天先讲解到这里,希望这篇文章能给大家带来帮助。


http://lihuaxi.xjx100.cn/news/239519.html

相关文章

hic染色体构想_了解微服务:从构想到起点

hic染色体构想by Michael Douglass迈克尔道格拉斯(Michael Douglass) 了解微服务:从构想到起点 (Understanding Microservices: From Idea To Starting Line) Over the last two months, I have invested most of my free time learning the complete ins-and-outs…

Linux-find命令应用举例-按时间筛选和删除文件

find参数说明: find有很多参数是以动作首字母时间的方式用于按访问、改变、更新时间来筛选文件。 动作表达: a(last accessed) 最近一次访问时间 c(last changed) 最近一次改变时间 m(last modified) 最近一次修改时间注意此上的c和m的区别,…

自动获取mysql建表语句_脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明...

常规建表语句:CREATE TABLE test_table (id int(11) NOT NULL,name char(64) NOT NULL,password char(64) NOT NULL,PRIMARY KEY (name,id)) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENTtest;解析脚本代码:# coding:utf-8import redeftable_design_transf…

MYSQL体系结构-来自期刊

MYSQL体系结构-来自期刊 MySQL三层体系结构|-----------------------------------------------------------------------------------| | mysqld-SQL层 | |-------------------------------------------…

windows 上rsync客户端使用方法

阅读目录 1.1 获取 windows上实现rsync的软件(cwRsync)1.2 cwrsync的使用方法1.3 cwrsync的使用回到顶部1.1 获取 windows上实现rsync的软件(cwRsync) cwRsync是Windows 客户端GUI的一个包含Rsync的包装。您可以使用cwRsync快速远…

mysql8.0 服务移除_Linux下彻底删除Mysql 8.0服务的方法

观看本文前最好有一定的Linux命令基础,具体为centos7.3环境中清除使用yum安装的Mysql卸载前请先关闭Mysql服务service mysql stop使用 rpm 命令的方式查看已安装的mysqlrpm -qa|grep mysql开始卸载Mysql服务使用yum安装需要先进行清除服务等yum remove mysql mysql-…

多伦多到温莎_我想要freeCodeCamp Toronto的Twitter来发布报价,所以我做了一个免费的bot来做到这一点。...

多伦多到温莎If you read About time, you’ll know that I’m a big believer in spending time now on building things that save time in the future. To this end, I built a simple Twitter bot in Go that would occasionally post links to my articles and keep my ac…

numpy.ndarray的赋值操作

matzeros((3,4)) #生成一个3行4列全部元素为0的矩阵mat[1,:]111 #从第1行第0列开始,一直到最后一列,赋值为1,效果与mat[1,0:3]相同,前置0可以省略,最后的列数可以省略输出:[[ 0. 0. 0. 0.][ 111. 111. 111.…