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,如果你有这个需求,那么你可以用NotificationManagerAPI作为替代;或者在这个方法里你试图绑定到一个服务,这种情况,你应该调Context.startService()方法来给service发送消息。

接收器所在进程的生命周期,当接收器的onReceive(Context, Intent)执行期间,所在进程会被认为是前台进程,而具备最高优先级,除非是内存严重不足,否者不会被kill的。当方法执行完返回之后,它就和普通的application的进程类似,如果该进程只有一个接收器在执行,那么当接收器方法执行完,它就被认为是一个空进程,而处于一个最低优先级状态,随时会被系统回收。

更多相关文章

  1. Android(安卓)左侧滑动窗口打开关闭监测
  2. android中动态给EditText获得焦点并弹起软键盘的方法详解
  3. android 修改menu 背景及添加图标
  4. Android使用MediaRecorder的stop方法报"stop failed"错误的解决
  5. Android(安卓)Activity 生命周期全解析
  6. Android(安卓)对话框
  7. Android中OptionMenu使用
  8. Map读取键值对,Java遍历Map的两种实现方法
  9. android resoult A>B 结束B A显示B中的内容

随机推荐

  1. Java+opencv3.2.0之膨胀与腐蚀
  2. java基础练习 01字串
  3. 【JAVA】通过ISBN一键获取书籍信息
  4. 201621123014《Java程序设计》第六周学习
  5. 【Android学习】案例学开发,天气记事本项
  6. java读写中文文件
  7. Java开发环境搭建:JDK8 下载与安装
  8. 自学java 的,有心的高手帮帮忙
  9. javaee基础知识点
  10. Java IO编程全解(三)——伪异步IO编程