Android广播总结

以前面几篇文章为基础,总结一下Android广播系统的一些知识

  1. Android广播分为有序广播和普通广播
  2. Android广播也可以分为前台广播和后台广播
  3. 广播接收器的优先级默认是0
  4. 动态注册的广播接收器是非常驻型,一般是跟着Activity的生命周期走,所以在Activity结束前需要取消注册广播接收器;静态注册的广播是常驻型,即使应用未启动,当有相关的广播发出时,其会被系统调用自动运行
  5. 当广播为有序广播时,优先级高的先接收(不分静态和动态);同级别的广播,动态优先于静态;同级别同类型的广播,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的
  6. 当广播为普通广播时(默认广播)时,无视优先级,动态优先于静态;同类型广播,静态:先扫描的有限于后扫描的,动态:先注册的优先于后注册的
  7. 动态注册的广播接收器,只可以接收使用隐式Intent发送的广播,显示的Intent发送的广播接收不到;静态注册的广播接收器可以接收显示Intent和隐式Intent发送的广播,但是显示Intent指示的ComponentName必须是静态注册的广播接收器的组件名
  8. 如果广播指定了FLAG_RECEIVER_REGISTERED_ONLY,则只有动态注册的接收器可以收到
  9. 不管是静态注册的还是动态注册的receiver,均默认运行在UI主线程,动态注册的receiver可以指定运行的线程
  10. 同一个BroadcastReceiver可以注册多次,每次的IntentFilter可以不一样,但是Handler和Context必须是一样的,否则会报IllegalStateException异常。
  11. 串行队列中的广播客户端收到后会调用服务端的finishReceiver,有序广播的动态注册的receiver和静态注册的都是在串行队列中。服务端因为需要等待客户端调用finishReceiver,以改变BroadcastRecord的状态,所以可以实现串行分发。
  12. 服务端到客户端的分发函数声明为oneway表示不需要等待函数执行结果,而立马返回。aidl中声明了oneway,在生成的xx.stub中函数没有reply.readexception,该函数会等待客户端执行完成再返回。无论是串行队列还是并行队列中的AMS调用各App的接口均是one-way的,所以当一个BroadcastQueue在等待处理串行队列中的广播时,仍然可以发送普通广播。

你可能感兴趣的:(android)