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

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


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

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

第1点 自定义广播

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

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


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

第2点 广播的类型

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

1.无序广播

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

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


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

2.有序广播

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

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


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

第3点 广播接收者的注册

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

1.动态注册

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


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

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

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

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


2.静态注册

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

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


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

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

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



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

举报
评论 0