BroadcastReceiver接受来自sendBroadcast()发送的Intent。有两种方法来注册BroadcastReceiver,动态或者静态。动态方法是通过android的接口registerReceiver及unregisterReceiver来绑定,静态呢则定义在AndroidManifest.xml的<receiver>标签里面。可以参考:Android提高第六篇之BroadcastReceiver.
一般情况下,如果你在resume中绑定了BroadcastReceiver,那么建议在pause的时候解绑定。这样可以避免不必要的系统开销。但是如果你的BroadcastReceiver是希望接受系统ACTION的,并且当activity在不在当前屏幕也希望接收。那么你在ondestroy的时候解开绑定。
Broadcast有两个类型的广播:
- Normal broadcasts:接受来自Context.sendBroadcast发送的INTENT。这种广播是完全异步的。所有该类型的广播接受者接受广播是无序的。这种方式大部分情况下,接受者都能同时获取广播并处理,具有更高的效率,但是对于这种情况,不能使用中断的API。
- Ordered broadcasts:接受来自Context.sendOrderedBroadcast发送的INTENT。而对于有序的广播,每次只能发送一个广播给一个接受者。每个接受者只能按照秩序来处理广播,并且当前接收器能传送一个Result给下个处理器,同时它也能abort本次广播,这样其它在它后面的接收器就无法接受到广播了。而接受器的接收顺序可以由intent-filter的android:priority属性来定义,如果android:priority一样那么就随机了。
另外需要注意的是,尽管BroadcastReceiver是通过Intent来进行通讯的,但是不要跟startActivity的Intent混同,它的Intent广播机制是跟startActivity的Intent机制完全隔离的。他们是完全不同的,BroadcastReceiver是不可能看到或者捕捉到startActivity的Intent的。
BroadcastReceiver的生命周期。一个BroadcastReceiver对象只在调用它的onReceive(Context, Intent)方法期间是被认为有效的。一旦从该方法返回,这个对象就被认为是无效的了。基于此,我们在onReceive(Context, Intent)方法中能做的事情,最好不要执行异步代码。因为你需要从一个异步执行的方法中返回,但是那时候该对象已经不存在了。特别支出,在onReceive(Context, Intent)方法里不要显示一个dialog,如果你有这个需求,那么你可以用NotificationManager
API作为替代;或者在这个方法里你试图绑定到一个服务,这种情况,你应该调Context.startService()方法来给service发送消息。
接收器所在进程的生命周期,当接收器的onReceive(Context, Intent)执行期间,所在进程会被认为是前台进程,而具备最高优先级,除非是内存严重不足,否者不会被kill的。当方法执行完返回之后,它就和普通的application的进程类似,如果该进程只有一个接收器在执行,那么当接收器方法执行完,它就被认为是一个空进程,而处于一个最低优先级状态,随时会被系统回收。