receiver在manifest中注册和java注册有什么区别

本文讨论了receiver在Android中的两种注册方式——manifest静态注册和代码动态注册。静态注册在AndroidManifest.xml中完成,而动态注册在代码运行时进行。静态注册的receiver常驻系统,可能影响系统效率,且在有序广播中系统优先级更高。通常选择动态注册以提高效率,并解决优先级问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 receiver在manifest中注册和java注册也就是说receiver的静态注册和动态注册


注册方式

  • 动态注册:代码注册:
    1. 生命创建的receiver  
    2. 通过IntentFilter创建并添加action
    3. 通过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:

  1. 提高系统效率:这两个事件是android的基本事件,如果大多数程序监听,会大大的拖慢整个系统,所以android不鼓励我们在后台监听这两个事件。
  2. 因为有序广播的优先级问题。以上这些广播中,静态注册时,系统的优先级大于应用,并且系统阻止了广播的向下传播。又因在Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的。
故用动态注册代替静态注册。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值