一、BroadcastReceiver是什么。
Android应用程序可以发送或接收来自Android系统和其他Android应用程序的广播消息,类似于发布订阅设计模式。例如,当各种系统事件发生时,例如系统启动或设备开始充电时,Android系统会发送广播。应用程序还可以发送自定义广播,例如,通知其他应用程序可能感兴趣的内容(例如,一些新数据已被下载)。
应用程序可以注册以接收特定的广播。当发送广播时,系统自动将广播路由到已订阅接收该特定类型的广播的应用。
一般来说,广播可以用作跨应用程序和正常用户流之外的消息传递系统。
系统广播
当系统发生各种系统事件时,系统会自动发送广播,例如系统切换飞机模式时。系统广播将发送到订阅接收事件的所有应用程序。
广播消息本身被包裹在Intent其动作字符串识别发生的事件的对象(例如android.intent.action.AIRPLANE_MODE)中。该意图还可以包括捆绑到其额外字段中的附加信息。例如,飞机模式意图包括一个布尔值,表示飞机模式是否打开。
二、接收广播
应用程序可以通过两种方式接收广播:通过清单声明注册和上下文注册。
清单声明注册
2、子类BroadcastReceiver和实现onReceiver(Context context,Intent intent)。以下示例中的广播接收器记录并显示广播的内容:
上下文注册
1、创建一个实例BroadcastReceiver。
BroadcastReceiverbr=newMyBroadcastReceiver();
2、创建Intentfilter并通过调用注册接收方RegisterReceiver(BroadcastReceiver , IntentFilter);
IntentFilterfilter=newIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br,filter);
3、要停止接收广播,请注销unregisterReceiver(android.content.BroadcastReceiver)。当您不再需要它或上下文不再有效时,请务必注销接收器。
注意在哪里注册和注销接收者,例如,如果您在onCreate(Bundle)使用活动的上下文中注册接收方,则应该取消注册,onDestory()以防止将接收者从活动上下文泄漏出来。如果您在其中注册了一个接收器onResume(),您应该取消注册,onPause()以防止多次注册(如果您不想在暂停时接收广播,并且可以减少不必要的系统开销)。不要注销onSaveInstanceState(Bundle),因为如果用户在历史堆栈中移回,则不会调用它。
三、发送广播
1、sendOrderedBroadcast(Intent,String)方法一次向一个接收器发送广播。随着每个接收机依次执行,它可以将结果传播到下一个接收机,或者它可以完全中止广播,使得它不会被传递到其他接收机。运行的订单接收器可以通过匹配的意图过滤器的android:priority属性来控制;具有相同优先级的接收器将以任意顺序运行。
2、sendBroadcast(Intent)方法以未定义的顺序向所有接收者发送广播。这被称为普通广播。这更有效率,但是意味着接收机不能从其他接收机读取结果,传播从广播接收到的数据,或者中止广播。
3、LocalBroadcastManger.sendBroadcast()方法向与发送方相同的应用程序的接收方发送广播。如果您不需要跨应用发送广播,请使用本地广播。实施效率更高(无需进行进程间通信),您无需担心与能够接收或发送广播的其他应用程序相关的任何安全问题。
四、接收权限
如果您在注册广播接收者时指定了权限参数(与清单registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)中的标签一起使用),则只有通过其清单中的标签请求许可的广播商才能发送接收器的意图。
例如,假设您的接收应用程序具有清单声明的接收器,如下所示:
或者您的接收应用程序具有上下文注册的接收器,如下所示:
安全考虑和最佳做法