第五章内容主讲广播(BroadCastReceiver):广播是一种可以跨进程的通讯方式
一、广播简介:
在一个IP网络范围中,最大的IP地址是被保留作为广播地址来使用的。比如,某个网络的IP范围是192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。
广播主要分标准广播(无序广播)和有序广播:
- 标准广播:异步执行的广播,广播发出后,所有的广播接收器几乎在同一时刻接收到消息。没有任何先后顺序。这种广播效率比较高,但是无法被截断。
- 有序广播:同步执行的广播,广播发出后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。这种广播是有先后顺序的,优先级高的广播接收器可以先收到广播消息,并且前面的广播接收器可以拦截消息,导致后面的广播接收器无法收到消息。
二、广播的动态注册
在代码中注册广播的方式被称为动态注册。新建一个类,继承自BroadcastReceiver并重写onReceive()方法。当广播到来的时候,onReceive()方法就会得到执行。
别忘了添加网络权限
三、广播的静态注册
动态注册的广播接收器可以自由地控制注册与注销,非常灵活,但是也有一个缺点,必须要在程序启动之后才能注册,要在程序未启动的情况下就能接收到广播,就要使用静态注册了。
这里需要注意的是,静态注册的广播接收器,必须要在清单文件中注册才可以使用
比如我们想监听一个开机广播消息
注意,不要再onReceiver()方法中添加过多的逻辑或进行任何耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长时间没有结束,程序就会报错,因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建状态通知栏,启动服务等等。
四、发送自定义广播
- 发送标准广播(无序广播)
先定义一个广播接收器来接收广播,然后在清单文件中对这个广播进行注册,并添加一个ACTIONN,比如说是:com.example.broadcasttest.MY_BROADCAST
- 发送有序广播
这里给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。并且可以在广播接收器的onReceive()方法中调用abortBroadcast()方法截断该条广播,后面的广播接收器将无法再接收到这条广播
五、本地广播
前面发送的广播属于系统全局广播,发出的广播可以被其他任何应用程序接收到,并且我们可以接受来自于其他任何应用程序的广播,这样就很容易引起安全性问题。所以Android引入了本地广播机制,这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,这样所有的安全性问题就不存在了。
本地广播是无法通过静态注册的方式来接收的,因为静态注册是为了让在程序未启动的时候也能收到广播,而发送本地广播时,我们的程序肯定时已经启动的,因此完全不需要使用静态注册的功能。
本地广播的优势:
1.可以明确知道正在发送的广播不会离开我们的程序,不用担机密数据泄露。
2.其他程序无法将广播发送到我们程序内部,不需要担心会有安全漏洞的隐患。
3.发送本地广播比发送系统全局广播高效