Android动态注册BroadcastReceiver:指定IntentFilter后需检查Action吗?
嘿,这个问题问得特别务实——我来给你拆解清楚:即使注册时已经传入了带指定ACTION的IntentFilter,仍然强烈建议保留接收器内部的action检查逻辑。原因主要有这几点:
应对代码变更的鲁棒性
现在你只给这个接收器注册了一个ACTION,但难保后续维护代码时,不会不小心用同一个接收器去注册其他Action(比如调用registerReceiver(mReceiver, new IntentFilter(ANOTHER_ACTION)))。这时候如果没有内部检查,你的doSth()就会被不相关的广播触发,导致意料之外的行为。避免过滤器配置失误
万一你在创建IntentFilter时不小心写错了ACTION(比如拼写错误),而内部检查的是正确的ACTION,至少不会让错误的广播触发你的业务逻辑;反过来,如果过滤器是对的,但内部检查写错了,你也能快速定位问题。双重校验能减少低级错误带来的麻烦。接收器复用场景的适配
假如你打算把这个接收器复用在多个地方,处理不同的广播动作,内部的action检查就是区分不同业务逻辑的关键。比如同一个接收器可能既要处理ACTION_UPDATE又要处理ACTION_DELETE,这时候内部判断就必不可少。系统广播的特殊情况
部分系统广播可能会携带多个关联的Action,虽然IntentFilter会过滤掉不匹配的,但保留内部检查能确保你只响应自己关心的那个,避免被系统的额外广播动作干扰。
举个简单的例子,假设你后来给同一个接收器加了另一个注册:
mContext.registerReceiver(mReceiver, new IntentFilter(ANOTHER_ACTION));
如果没有内部的if(ACTION.equals(intent.action))判断,当ANOTHER_ACTION的广播到来时,doSth()也会被执行,这显然不是你想要的结果。
所以总结下来,这行检查代码虽然看起来多余,但却是提升代码健壮性的最佳实践,值得保留。
内容的提问来源于stack exchange,提问作者Bazouk55555

