广播机制简介
Android的广播可以分为两种类型的,标准广播和有序的广播;
标准广播: 是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎是同一时接收到这条广播。
有序广播: 是一种完全同步执行的广播,在广播发出去之后,同一时刻只有一条消息能接收到这条广播。当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递,所以这个时候的广播接收器是有先后顺序的,优先级高的广播接收器就可以先接收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样的话后面广播接收器就不能接收到广播消息了。
动态注册监听网络变化
下面通过做一个监听网络变化的例子,好好理解一下广播。
注册广播的方式有两种,在代码中注册和在AndroidManifest.xml中注册,其中前者也被称为 动态注册 后者也被称为 静态注册。
那么该如何创建一个广播接收器呢?其实也很简单,让它继承自 BroadcaseReceiver ,并重写父类的 onReceive() 方法就行了,这样当有消息来临的时候onReceive()方法得到执行。具体的接收到广播之后的逻辑就可以在这里处理了。
1、在getSystemService这个方法里,代码没有截取完整,完整的代码是 context.CONNECTIVITY_SERVICE
2、系统为了保护用户的隐私安全,是需要我们获取一下网络权限的,这个就是 Androidmanifest.xml 文件中注册
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
注意它和application标签是同级的,不是包含的application标签里面的
静态注册
上面我们说的是动态的注册,我们可以看到动态注册广播接收器可以自由的控制它的注册和销毁,很是灵活,但是我们想一下有这样的一个场景,我们的动态注册都是在onCreate()方法里面的,那有没有在程序还没有启动的情况下就能接收到广播呢?答案是当然可以,这就需要我们使用静态注册,也是我们接下来需要写的静态注册。
它的创建方法如下:
1、创建的路劲如下 File - New - Other 你就能看到 Broadcast Receiver
2、Exported 表示是否允许这个广播接收本程序以外的广播
3、Enable 表示是否启用这个广播
创建之后我们需要写的代码全都在AndroidManifest.xml中,里面涉及到的问题以及都在下面的代码中:
另外:我们创建的StaticReceiver里面的代码我们就不看了,也就是一个onReceive方法,有一点需要我们注意的,不管是静态还是动态都需要我们注意的点是:
注意一下,onReceive方法里面不要写过多的逻辑代码或者换进行其他的耗时操作、因为在广播接收器中是不允许开始新的线程的,要是这个方法长时间的没有响应,程序就会报错。
发送广播
发送广播这里我们就直接看看代码是怎样发送标准广播和有序广播的。
还要一个本地广播我们代码是写在一起,那本地广播是用来干什么的呢?不知道是否还记得前面我们说的静态注册广播可以接收其他应用程序的广播,这样就降低的程序的安全性,容易引发安全问题!为了解决这个问题,安卓就引入了本地广播的概念,本地广播就是发出的广播只能够在程序的内部进行床底,并且广播接收器也只能来接收来自本应用程序发出的广播,提高了程序的安全性!
我们这里就只写了注册以及发送,注册这部分就不在写了,还是在我们的onDestroy方法里面注销。
下面这里还有一点需要我们注意的,就是有序广播发出之后,接收器的优先级的问题,代码如下:
上面就是我们总结的关于安卓广播通知的问题!