receiver在manifest中注册和java注册也就是说receiver的静态注册和动态注册
注册方式
- 动态注册:代码注册:
- 生命创建的receiver
- 通过IntentFilter创建并添加action
- 通过registerReceiver(receiver, filter)注册
- 静态注册: AndroidManifest.xml 中注册通过
- receiver -intent-filter-action 标签
- recer是标明这是个广播
- intent-filter标明action可用
- action就是我们的广播标识
常驻与非常驻
静态时常驻形,动态是非常驻形
动态注册时候如果在Activity.onResume()动态注册一个接收器,你应该在 Activity.onPause()取消它的活动。
registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。如果我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了,所以要在暂停的时候给她取消活动。
时间
同一优先级的广播接收器,动态的要比静态注册的早。
一个有序队列,如果有相同的优先级存在,原因有2个:1排序子因素,2按某种操作可能影响顺序。
通过android动态注册广播接受器的源码, ActivityManagerService.java 文件找到了 registerReceiver 的实现。通过对final ArrayList<BroadcastRecord> mOrderedBroadcasts 成员变量的操作找到对 receivers 排序的代码,并且判断也是 priority 的值,用的是 >= 方式
广播实现类的位置
静态基本在同一activity实现,动态基本要新建一个类实现
综上所述,一般我们采用动态,原因有2:
- 提高系统效率:这两个事件是android的基本事件,如果大多数程序监听,会大大的拖慢整个系统,所以android不鼓励我们在后台监听这两个事件。
- 因为有序广播的优先级问题。以上这些广播中,静态注册时,系统的优先级大于应用,并且系统阻止了广播的向下传播。又因在Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的。