1、广播的定义
广播是一种应用程序间的通信机制,使用Intent来传输数据,使用观察者模式来注册和发送广播,当程序发送一条广播的时候,只要和发送广播action相同的接收者都能接受到这条广播。
2、广播的应用场景
(1)同一个App多个进程的不同组件间的消息通信(定位进程和主进程)
(2)不同App之间的不同组件间的消息通信(同一个公司不同App之间的运营和推广)
3、广播的种类
(1)普通广播:普通广播通过Context.sendBroadcast()来发送广播,是完全异步的,消息传输效率比较高;但是无法保证广播接收者的执行顺序,也无法把上一个Receiver的处理结果传递给下一个Receiver,并且无法终止广播的传递;
(2)有序广播:有序广播通过Context.sendOrderedBroadcast()来发送广播,所有Receiver按照优先级高低依次执行,Receiver也可以把处理结果传递给下一个Receiver,同时也能终止广播的传递;
(3)本地广播:本地广播通过LocalBroadcastManager.sendBroadcast()来发送广播,前面两个广播都是全局的,所有应用程序都可以接收到,但是本地广播只在自己的应用程序内传播,安全性相对提高了;
4、Receiver的注册方式
(1)静态注册:直接在Manifest文件中注册,注册完成后就一直运行,即使所依赖的Activity被销毁了、进程被杀死了依然能接收到广播;
(2)动态注册:通过registerReceiver()和unregisterReceiver()自由地控制注册与注销,跟随Activity的生命周期,当所依赖的Activity被销毁了,广播接收者也就失效了;
PS:两种方式最重要的区别:静态注册无须应用启动就能接收到广播,而动态注册需要应用启动后才能进行注册并接受广播。
5、广播的内部实现机制(Binder通信模型)
(1)自定义广播接收者BroadcastReceiver,并且重写onReceiver()方法;
(2)BroadcastReceiver通过Binder机制向AMS进行注册;
(3)广播发送者通过Binder机制向AMS发送广播;
(4)AMS查找符合条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到相应的BroadcastReceiver的消息循环队列中;
(5)消息循环执行拿到此广播,回调BroadcastReceiver中的onReceiver()方法;
6、本地广播详解
(1)本地广播特点
a. 使用它发送的广播将只在自身app内传播,因此你不必担心泄漏隐私的数据;
b. 其他app无法对你的app发送该广播,因此你的app根本不可能收到非自身app发送的该广播,因此你不必担心有安全漏 洞可以利用;
c. 比系统全局广播更加高效;
(2)内部实现机制
a. LocalBroadcast高效的原因:因为它内部是通过Handler实现的,它的sendBroadcast()方法含义并非和系统的 sendBroadcast()一样,它的sendBroadcast()方法其实就是通过Handler发送了一个Message而已;
b. LocalBroadcast安全的原因:既然它是通过Handler实现广播发送的,那么相比系统广播通过Binder机制实现那肯定更 加高效,同时使用Handler来实现,别的app无法向我们应用发送该广播,而我们app内部发送的广播也不会离开我们的app;
c. LocalBroadcast内部协作主要是靠两个Map集合:mReceivers和mActions,当然还有一个List集合mPendingBroadcasts,这个主要存储待接收的广播对象;
网友评论