Android中的broadcastReceiver就是Android的广播,Android系统内置了很多系统广播,我们可以在应用程序中通过监听这些广播来得到系统的各种信息,包括电池的电量变化、网络变化、时间或者时区变化等信息,通过监听广播,当这些系统内置硬件发生变化后,我们可以更新我们的界面将变化展示出来。

Android的广播分为两种,一种是无序的广播,就是一个人发送,大家都能接收,不分前后,人人有份,而有序广播则是通过系统优先级进行传播,前面优先级比较高的可以拦截最初发送的信息。

注册广播分为两种,一种是静态注册,就是在AndroidManifest.xml文件中配置,第二种是在我们的代码处注册,也就是动态注册。

创建我们广播接收器比较简单,只需要我们继承系统的broadcastReceiver,并重写onReceiver方法,当广播变化信息接收到后,就可以在onReceiver方法中进行处理包括逻辑处理或者界面变化。

首先来说动态注册。

(1)首先新建自己的广播接收器,继承broadcastReceiver,重写onReceiver()方法。

(2)我们注册广播使用的方法registerReceiver接受两个参数,第一个参数为broadcastReceiver,这里传入我们的新建的广播接收器,第二个参数为intentfilter,所以,我们需要初始化一个intentfilter,然后通过添加action来确定我们要监听什么样的系统广播。

(3)既然有注册方法,那么就有解注册方法相对应,解注册方法unregisterReceiver方法,在我们的destroy方法中执行。

这样我们的广播接收器就可以正常运行了。

监听网络变化的action是Android.net.conn.CONNECTIVITY_CHANGE;

当我们调用intent filter的addaction方法时,我们就能在网络变化的时候,在我们新建的广播接收器的onReceiver方法中进行处理。

获取网络信息的代码:

android 后台广播 android系统广播有哪些_广播接收器


动态注册的优点是很灵活,我们可以自由的控制注册和注销,但是缺点就是必须在启动以后才能接受到广播,因为注册就写在onCreate方法中,如果我们想让程序在未启动的情况下就接受到广播,我们就可以使用静态注册,因为我们把注册代码写在了配置文件中,这样当我们的手机启动收到这条信息,比如手机的开机信息等。

和我们动态注册一样,我们需要在intentfilter中添加action,之前是通过代码,现在是通过intentfilter标签和action标签。

需要注意一点的是我们不能在onReceiver方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接受器中是不允许开启线程的,当它长时间运行而没有结束的时候,就会报错。

我们之前使用的是系统广播,很多情况下,我们还需要自定义广播,使用自定义广播和系统广播类似,只是是我们主动发送广播,而不是去监听系统的广播。

(1)新建一个广播接收者,这样当我们的自定义广播发送后,有人接收,也能证明了我们发送成功;

(2)静态注册广播接收者,然后表明我们要接受的action;

(3)在我们的java文件中找个地方触发我们的广播发送,比如button的点击事件,发送广播使用的也是我们的intent,这里的intent接收一个参数,参数为我们的action值,然后调用context的sendBroadcast方法,参数为我们初始化的intent。这样当我们点击button时,就发送了一条广播,因为是使用intent,我们还可以通过intent来传递一些数据。

发送有序广播调用的方法是sendOrderBroadcast方法,这个方法接受两个参数,第一参数和我们的发送标注广播的一样,接受一个初始化的intent,第二个参数是一个与权限有关的字符串。这样就可以房广播了,那么他有序在什么地方呢,我们可以在我们的配置文件中在注册的receiver的intentfilter中,添加priority参数,通过设置这个参数,就可以对各个广播接收者进行优先级区分。既然有了优先权,那么优先级高的广播接收者就可以决定是否还要把信息继续往后传,在我们自己写的广播接收者的onReceiver方法中,添加abortBroadcast方法,这个方法就是表示将这条广播截断,后面的优先级比较低的广播接收者将无法收到这条广播。

我们上面说过的广播都是全局广播,发出去的广播可以被其他的任何应用程序接收到,然后我们也可以接收到来自于其他任何应用程序的广播,这样就很容易产生安全方面的问题,为了避免这种情况,我们可以使用本地广播,Android的本地广播机制,使用这个机制发出的广播只能在应用程序内部进行传递。

我们使用本地广播主要是使用localBroadcastManger来管理广播,并且提供了发送广播和注册广播接收器的方法。

(1)拿到localBroadcastManager的实例,通过local Broadcast Manger的getInstance方法,传入的参数就是我们的上下文对象;

(2)初始化intent,参数为我们的action;

(3)调用localBraodcastManger的sendBroadcast方法,参数为intent;

我们注册本地广播监听和之前的一样;

(1)初始化intentfilter;

(2)添加action,参数和我们发送的action一致;

(3)调用localBroadcastManager.registerReceiver,参数有两个,第一个是我们的localReceiver参数,第二个是intentfilter;

(4)调用local Broadcast Manager的unregisterReceiver方法,解注册。

需要注意的是本地广播是无法通过静态注册的方法来接收的,因为静态注册的目的就是为了我们的程序还未启动的时候来接收广播,而本地广播发送的时候,我们的程序肯定是已经启动了,那么也就不需要使用静态注册的功能。