您的当前位置:首页正文

29、Android开发基础之广播接收者BroadcastRec

来源:要发发知识网

Android广播接收者
好久没有回来写文章了,尽量有空就写吧,感谢大家的关注。涨粉了,有动力哈!

其实我每次录视频之前都想写好文章,让大家看完文章,再去看视频!

今天我们要学习的是广播接收者:

什么是广播接收者?

我们小时候都知道,听广播,收听广播!什么是收听广播呢?打开收音机,调频就可以收到对应的广播节目了。其实我们在Android开发中也有类似的概念,所以就称之为广播了。

广播包括发广播和广播接收者,这就类似于我们的广播发射塔和收音机。

因些,在Android开发中,我们主要研究的就是发广播和接收广播了

监听电量变化状态(例子)

我们先从一个例子开始吧,后面我们从这个例子里头分析里面的各种知识点。

首先,我们创建一个Receiver类:

上面的代码呢,是继承自己一个广播接收者BroadcastReceiver,这就类似于这个就是我们的收音机了,我们收听的频道是什么呢?由这个Action定,在那里添加Action频道呢?

这就是第二步:添加权限

<uses-permission android:name="android.permission.BATTERY_STATS"/>

权限在那里添加呢?在AndroidManifest.xml配置文件里,如图所示:

第三步,我们在ManiActivity里注册一下:

上面这代码的意思就是我们需要注册一下这个广播接收者,有没有觉得它中回调有点类似呢?但是我们是有条件地接受广播。这其实就类似于我们的收音机需要设置一个频道,收到这个频道的相关广播。而我们广播则是设置action,接下来的话,我们就把这个应用跑起来看看能不能接收到广播。我们监听着Android手机的电量变化情况

运行:

我们把这个程序跑起来,然后通过模拟器去模拟电量的变化,然后就可以收到了电量改变的广播了…

要注意的地方:

我们的应用要跑在前台哦,因为我们是动态注册广播接收者。我们的Activity创建的时候,会注册,在onDestroy的时候会取消注册。所以我们要保持这个我们的界面在前台才可以接收到广播。

至于什么是动态注册和静态注册,后面我们会讨论到 。大家先完成这个例子。

广播的分类

从发广播者上面分,可以分为系统广播和第三方广播。

从接收的顺序上分,可以分为有序广播和无序广播。

常见的系统发出的广播有那些呢:比如说系统的开机完成广播、Wifi状态改变的广播、SD卡挂载的广播、电量的改变广播…

广播的注册方式

广播有两种方式注册:静态注册和动态注册。

静态注册

1、注册方式:在AndroidManifest里进行注册。

首先在Application节点里头,添加一个receiver节点。name则是我们的广播接收者。

比如说,我们监听开机广播,那么我们跟前面一样,创建一个收音机,也就是广播接收者:

接着,这就是静态注册了,在AndroidMainfest.xml里的application节点里添加receiver节点,并且添加意图过滤的action:

并且需要添加权限:

OK,我们把程序跑起来,这个是静态注册,即使我们写的应用不在前台,也能接收到广播。这是静态注册的特点,我们后面会进行总结的。

这样子我们把机器重启一下,看能不能获取到开机完成的广播:

静态注册内部类广播要注意什么呢?

首先是静态注册,其次是内部广播接收者!如果是外部类广播接收者,不需要静态。

1、这个内部广播接收者需要声明为静态的;

2、这个内部的静态接收者必须是public的;

3、在receiver的name里是外部类的名字$内部类的名字

这就是静态注册方式啦!接下来,咱们再来一个动态注册,其实前面的话,我们已经进行了动态注册的例子了,就是我们开头那个。

动态注册

动态注册的例子前面也有,这里的话,我们写别的例子吧!多写点例子,让同学们更熟悉广播的注册。注意,是广播的注册!!!后面我们才讲到广播的发送!

假设我们做一个地图软件 ,当我们知道屏幕锁定以后,那么就不去更新数据,如果是屏幕打开了,就去更新数据。为什么要这么做呢,一是省电,二是省流量,对吧!

怎么做呢?

首先,我们编写一个广播接收者:

我是在MainActivity这个类里头创建了这个广播接收者,一般来说,动态接收的广播多数情况下是内部类,这样子可以操作外部类。

接着呢,就是注册广播了:

我在onCreate方法里进行注册:

广播注册以后,要记得在不用的时候进行销毁,这个应用于对我们来说,就是在退出的时候,我们就不需要地广播进行监听了,所以我们直接在onDestroy的时候,去取消注册即可。

好啦,以下是整个代码:

接收这个广播不需要权限,大家怎么知道是否需要权限呢?比如说前面我们写的例子,监听开机广播。我们可以在android studio里敲出:Intent.ACTION_BOOT_COMPLETED,然后点击进去看看:

{@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission in order to receive this broadcast.

这句话的意思就是,你需要这个权限”android.permission.RECEIVE_BOOT_COMPLETED”

目的是为接收这个广播,否则你接收不到。

一般来说,在我们的action里会说明,如果以后,你自己写广播,在自己的action里也要说明一下需要什么权限了。

两种注册方式的区别

静态注册可以一直监听着,即使应用没有起来,也可以监听着,但是耗资源,长期监听着。

静态注册的广播优先级高于动态注册的广播。

动态注册的优点就是省资源,需要的时候才监听,不需要的时候需要取消注册。

不可以静态注册的广播

有些广播,只可以动态注册的。有那些呢?

为什么不可以静态注册?

如果不是必须一直监听着的广播,如果一直监听着会消耗资源,所以静态注册会提高系统的效率。而动态注册的话需要释放资源取消注册,否则会报错的。这样子有利于提高系统的速度。

如何发送广播

前面的话我们都是接收系统发出来的广播,接下来我们自己也发广播。

假设你做一个应用,比较牛逼一点的,对吧!需要对多进行通知。做这类应用有两种情况:

第一种是做sdk开发的,也就是开发sdk给别人使用的。

第二种是应用内广播,其实就是通知。

PS:额外的知识,我们学习android的广播机制有什么用呢,其实就是用于通知。如果在应用内,我们常用的通知方式是回调和广播。这两者之前,回调的速度快,保障性高,而广播则简单,但是速度没有回调高。什么情况下使用广播呢?当有多个地方使用等待通知的时候,可以使用广播。原理上广播和回调差不多的,广播的原理就是使用Binder机制,把action注册到ActivityManagerService里头,然后广播的时候,就去里面寻找符合规则的,再调用onReceive这个方法。

另外一种情况就是跨进程通讯,后面我们会学习到AIDL,这里的话是广播。广播是可以跨应用通知的,比如我们接收到了系统的广播对吧!也可以进行权限的控制,谁可以接收到这样的广播

好,回到我们的主题,怎么样发送广播呢?

我们先不讨论发送有序广播,我们就随随便便发个广播通知!

这个是我们的布局文件,就一个按钮,我们点击按钮的时候,就去发送广播。

以下是Activity的内容,从代码看出我们是怎么发送广播的:

然后呢,我们再写一个广播接收者来接收广播,这个接收者可以是在第三方应用,也可以在我们本应用,我们写一个静态注册来注册它。前面已经教过大这怎么编写广播接收者了,并且怎么注册。这里的话我们写一个内部类来接收。前面说到了,要注意的是,内部广播接收者类,需要是静态的,Public的,注册的时候,是外部类名$内部类名

静态注册的代码:

然后我们设置一下 这个Activity是主的Activity,也就是启动时候,它先启动。

再跑起这个程序:

这就是我们自定义的广播发送者和广播接收者啦!

有序广播

前面我们所讲到的都是无须广播,也就是发出去了,任何应用都可以接收到,只要有对应的Action就可以了。

这样子类比过去,我们就更容易理解了,对吧!

无须广播就像上学时的学校广播,谁都可以听到;有序广播则像是校长的通知,一级一级往下传。里面的主任呀,级长呀,可以修改内容,甚至是中断往下传达!

以一个例子来说明吧:

假设学校收到一笔捐款,用于资助各年级各班的贫困学生。

于是:我们有一个广播发送者叫做xxx基金会,给每个贫困学生发送1000块钱的资助金。

布局跟前面一样,只有一个按钮:

然后呢,是Activity的代码,怎么样去发送有序广播!

这里怎么简单怎么样,关于权限的问题后面我们再解释。先给大家解释一下,每个参数是什么意思先!

上面这个是原方法:

第一个参数,不用说了,我们发送广播就知道了,这个是意图对象,用于封装数据和设置过滤。

第二个参数是权限,权限我们后面会详细说到,虽然很少用到,但是你知道这个思想,有利于你以后自己钻研android的代码。

第三个参数是广播接收者,这个广播接收者是最终接收的广播接收者,用于检查数据是否有传达或者数据被修改。

第四个参数是一个自定义的Hanlder,用于处理结果接收者,也就是上面那个接收者的回调。

第五个参数是初始码,这个会作为结果码,通常是Activity.RESULT_OK,也就是-1。

第六个参数是用于传递数据的,这个数据在各个Receiver里获取到,通过getResultData方法获取。这个其实通常为null

第七个参数也是用于封装数据的,不同的是,这个用于封装数据集合,从上面的代码可以知道 ,我用来封装了一个钱的数据。

以下是原api的说明文档:

写完了发送者以后,我们就会去写一下接收者了。

三个接收者的代码如下,分别是学校接收者,年级接收者,班级接收者,贫困这生接收者!

班级接收者:

贫困学生接收者:

广播也写好了,那么就是注册广播了:

在AndroidManifest.xml文件里头;

关于优先级的说明在注释里已经有了priority就是优先级的意思。

那我们就把程序跑起来吧,看谁先接收到广播:

好啦,从上面的例子,我们可以看到,广播是按优先级通知的,并且可以修改广播的内容。

也可以终止广播的传达,假设这笔捐款到了学校就不往下传了,怎么处理呢?

abortBroadcast(),我们加了这句代码,运行结果如下:

说明不会再往下传递了。

无序广播和有序广播的区别

学习了前面的内容,我们知道了有序广播和无序广播。那么这两者间有什么区别吗?

本质上是一样的,也就是说,无序广播是按注册顺序派发的,有序广播按优先级。我们知道一下特点就可以了。

有序广播的接收者可以终止/修改数据,而无须广播不可以。

广播的权限

前面我们有提到权限,但是我们一笔略过,到这里才对权限进行分析。广播的权限分为两部分,一部分是我可以接收谁的广播,一部分是谁可以给我发广播。这就是权限啦!

我发的广播谁可以接收到?

如果要做到我发的广播,有权限的人才能接收到,那么需要这样做:

在AndroidManifest.xml中声明permission

 <permission android:name="com.sunofbeaches.permission.DONATION"/>

发送广播的时候把permision加上,比如说:

Manifest.permission.DONATION这一句其实就是我们前面定义的权限,按Control点击可以跳过去。

第三步则是在需要接收的应用里头,添加权限,因为我们这里是同一个应用,所以在本应用添加就可以了:

这样子就可以接收到广播了!

谁有权限给我发广播

谁有权限给我发广播,这个其实在receiver的节点里头,就有一个permission的属性:

这个Permission声明就是用于控制谁有权限给我发广播的。

好啦,就写到这里吧,欢迎各位分享和保留原文链接!

说好的视频呢?下周吧,现在都已经凌晨一点了,不录制视频了!

欢迎加入我们的网站和学习交流网站:阳光沙滩