广播用于在应用程序间传播数据,是一种“发布-订阅模式”,也就是观察者模式。一个广播可以有任意多个接收者。特点在于只关心发送而并不关心接收者是否接收到数据、如何处理数据。
组成元素:发送广播的BroadCast、接收广播的BroadCastReceiver、以及用于传递信息的Intent。
有以下几个分类
- 普通广播
- 有序广播
- 本地广播
- Sticky广播
普通广播
普通广播是异步的。通过Context的sendBroadCast()来发送。消息传递效率高,接收顺序不确定。无法终止广播的传递。
首先,定义广播接收器
![](https://img.haomeiwen.com/i1920845/8c9ad71caaeb774b.png)
其次、进行注册
![](https://img.haomeiwen.com/i1920845/465a538a1815153f.png)
最后-发送广播
![](https://img.haomeiwen.com/i1920845/a67b5c0df3cb786f.png)
广播接收器可成功接收到广播。
另一种注册方式,在代码中实现动态注册。记得在
![](https://img.haomeiwen.com/i1920845/927b160174a71dff.png)
两注册方式的不同点
1-在代码中动态注册的广播会随着依附的Activity的生命周期的结束而借宿。
2-XML注册的广播是常驻型的,不受生命周期的影响。即使APP关闭了,当有广播来的时候还是会被启动。
有序广播
通过Context.sendOrderBroadCast()来发送。广播接收器按照优先级依次执行。
![](https://img.haomeiwen.com/i1920845/a5307ed05c9db392.png)
数值越大优先级越高。
优先级前的广播可以通过setResult()方法将结果传递给下一个广播,下一个广播可以通过getResult()方法获取上一个广播接收器返回的结果。
![](https://img.haomeiwen.com/i1920845/f1300d3dc2dc2723.png)
![](https://img.haomeiwen.com/i1920845/094c80cf4b7af1ae.png)
![](https://img.haomeiwen.com/i1920845/70c1de94e19c3871.png)
![](https://img.haomeiwen.com/i1920845/5a761fac56653cab.png)
在这里也可以设置初始的传递数据。
![](https://img.haomeiwen.com/i1920845/64ca46fc42695a9d.png)
可以使用abortBroadCast()方法来让系统飞起该广播,让他不再往下传递。
![](https://img.haomeiwen.com/i1920845/979231605504f903.png)
![](https://img.haomeiwen.com/i1920845/93eb88296cda9792.png)
可见广播不会再往下传递。
本地广播
21的support v4新增了本地广播,即LocalBroadcastManager。普通广播跟有序广播都是全局的,所有的应用都可以接收到。存在安全隐患。本地广播是只存在于应用内的广播。发送本地广播也无需通过系统去中转,效率会更高。
需要注意的一点是,本地广播无法通过静态注册来接收。
用法:
之前是用context去调用,sendBroadcast 、registerReceiver 、unregisterReceiver 现在改用** LocalBroadcastManager getInstance (Context context)**调这些方法。触发器和过滤器不用变。
注册
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, intentFilter);
取消注册
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
发送异步广播
LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(MyCastReceiver.ACTION));
发送同步广播
LocalBroadcastManager.getInstance(context).sendBroadcastSync(new Intent(MyCastReceiver.ACTION));
注意:注册和取消注册要放到OnResume和OnPause里。
![](https://img.haomeiwen.com/i1920845/b145722fec522745.png)
发送一个Sticky广播
通过sendStickyBroadCast()函数来发送。发送的广播会一直滞留。当有匹配此广播的广播接收者被注册后改广播接收器就会接收此条广播。发送Sticky广播时需要声明权限:
![](https://img.haomeiwen.com/i1920845/5da62d728b394c43.png)
sendStickyBroadCast()只保留最后一条广播,并且一直保留下去。及时已经有广播接收器处理了该广播当再有匹配的广播接收器被注册的时候,此广播仍然会被接收。
如果只想处理一遍该广播,可以通过context.removeStickyBroadcast(intent);来实现。
我们为什么要使用广播
- 监听系统的状态
- 自定义一些广播,提示消息更新等。
注意
不要在onReceive()中添加过多的逻辑或者执行任何耗时操作。在广播接收器中是不允许开启线程的。广播接收器更多扮演打开程序中其他组件的角色(比如启动Activity、发送通知或者开启Service等。)
在onReceiver中弹Dialog:
![](https://img.haomeiwen.com/i1920845/d7e7b5642ed18c5b.png)
![](https://img.haomeiwen.com/i1920845/1c0827f1540e747f.png)
网友评论