BroadcastReceiver:广播的使用
广播是Android四大组件之一。用广播可以实现简单进程间通信;一定程度上还能解耦;关于BroadcastReceiver的原理参考BroadcastReceiver工作流程。
广播除了用来通知,桌面小部件AppWidgetProvider也是继承自BroadcastReceiver实现更新桌面挂件的,参考AppWidgetProvider:桌面小挂件。
1、BroadcastReceiver
1.1、简介
BroadcastReceiverAndroid四大组件之一,常用于不同组件和多线程之间的通信。适当的通过广播通信,传递简单的数据可以极大的降低模块耦合!
1.2、广播的类型
Android中的广播机制可以分为标准广播和有序广播两种类型。
①标准广播:是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎同时接收到这条广播消息,它们之间没有任何项目顺序可言。这种广播的效率比较高,但也意味着它是无法被截断的。
②有序广播:是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。此时的广播接收器是有先后顺序,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
2、注册广播
作为Android四大组件之一,四大组件都必须在AndroidManifest中注册,但是广播比较特殊。广播有两种注册方式:静态注册和动态注册。现在广播都是通过动态注册才能生效,所以现在AndroidManifest.xml中不需要注册BroadcastReceiver也可以使用。
2.1、静态注册(废弃)
在AndroidManifest中注册receiver节点即可
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="***" />
</intent-filter>
</receiver>
2.2、动态注册
在代码中动态注册广播,
mBroadcastReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("***");
registerReceiver(mBroadcastReceiver, intentFilter); 记得注册的广播接收器一定要反注册,否则会造成内存泄漏
unregisterReceiver(mBroadcastReceiver);
3、发送广播
广播的发送很简单,广播发送基本原理参考BroadcastReceiver工作流程。
3.1、发送有序广播
使用sendOrderedBroadcast(Intent intent,String receiverPermission)方法发送有序广播:
Intent intent = new Intent(action);
sendOrderedBroadcast(intent, null);
3.2、发送标准广播
sendBroadcast(Intent)方法比较常用的发送广播
Intent intent = new Intent(action);
sendBroadcast(intent);
4、本地广播
前面发送的广播都是全局的,其它应用可以接收到。可能会造成安全泄漏,Android提供了一种本地广播,通过LocalBroadcastManager,只在本应用内传递,不会被三方APP接收到的广播。本地广播LocalBroadcastManager内部通过Handler实现,详见LocalBroadcastManager源码解析。
4.1、注册本地广播接收器
接受本地广播需要借助LocalBroadcastManager注册本地广播接收器:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter);
同样的也需要反注册本地广播接收器:
localBroadcastManager.unregisterReceiver(BroadcastReceiver);
4.2、发送本地广播
发送本地广播也需要通过LocalBroadcastManager:
localBroadcastManager.sendBroadcast(intent);
参考资料:
Broadcasts overview
Implicit Broadcast Exceptions
Android广播机制的两种类型
Android广播--官方文档