Broadcast Recevier 广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。 应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。 广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。句段摘自Android Broadcast Security
一,API解读
BroadcastReceiver
- 抽象类,继承自 java.lang.Object ,类的声明为:public abstract class BroadcastReceiver
- API位置:android.content.BroadcastReceiver
- 直接子类:AppWidgetProvider, DeviceAdminReceiver, MediaButtonReceiver, RestrictionsReceiver, WakefulBroadcastReceiver
这是接受由sendBroadcast()发送的Intent的代码的基类。
如果broadcast只是在自己应用内发送接收,应该考虑使用 LocalBroadcastManager类,
广播接收器的注册方式有两种
- 一种在类中动态注册,
- 一种在AndroidManifest.xml中用 标签注册,
在动态注册中,如果是在 Activity.onResume() 中实现的注册事件,那就应该在 Activity.onPause(). 取消注册。
可以接收的广播有两种
- 一种是正常广播, Context.sendBroadcast发送,Normal broadcasts是完全异步的可以同一时间被所有的接收者接收到。消息的传递效率比较高。但缺点是接收者不能讲接收的消息的处理信息传递给下一个接收者也不能停止消息的传播
- 一种是有序广播,Context.sendOrderedBroadcast发送,根据设置的优先级决定发送广播发送的次序。Ordered broadcasts的接收者按照一定的优先级进行消息的接收。如:A,B,C的优先级依次降低,那么消息先传递给A,在传递给B,最后传递给C。优先级别声明在中,取值为[-1000,1000]数值越大优先级别越高。优先级也可通过filter.setPriority(10)方式设置。 另外Ordered broadcasts的接收者可以通过abortBroadcast()的方式取消广播的传播,也可以通过setResultData和setResultExtras方法将处理的结果存入到Broadcast中,传递给下一个接收者。然后,下一个接收者通过getResultData()和getResultExtras(true)接收高优先级的接收者存入的数据。句段摘自Android开发之BroadcastReceiver详解
注意,尽管广播也是通过intent类发送和接受广播,但是,这种Intent broadcast机制和通过 Context.startActivity()启动Activities 的intent是不同的概念
安全:
通过 Context APIs实现Receivers,会赋予其夸应用的性质。所以必须考虑会有其他程序滥用这些广播接收器:
- intent命名空间是全局性的,要确保定义的意图动作名称和其他的字符串是自己独有的,防止不经意的与其他应用造成冲突
- 注册广播时,设置权限决定哪个接收器可以接受它
- 在AndroidManifest.xml中注册广播时设置了意图过滤器,其他应用也会通过这个意图过滤器发送广播,如果阻止发送,设置 android:exported=”false”
- 除了可以通过设置广播接收器的权限限制谁可以接受谁的广播外,从 ICE_CREAM_SANDWICH,开始,可以通过调用 Intent.setPackage设置单一某个包接受广播
使用LocalBroadcastManage意图不会在进程之外传递,全无这些问题
接收器生命周期:
BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效,一旦此方法中进行return ,系统会认为其结束了并且不再执行.
此方法内不能进行任何异步或耗时的操作,尤其是不能使用BroadcastReceiver显示对话框或绑定服务,对于前者,可以使用NotificationManager API., 对于后者,可以通过调用 Context.startService() 向service发送一个命令.
进程生命周期:
正在执行BroadcastReceiver的进程(也就是说正在执行 onReceive(Context, Intent)