动态注册BroadcastReceiver相关疑问:onReceive调用时机与WiFi接收器触发
动态注册BroadcastReceiver的常见疑问解答
让我逐个拆解你的两个问题:
1. 动态注册的BroadcastReceiver的onReceive方法是否总会在注册完成的那一刻被调用?
当然不是,这得看你注册的是哪类广播。
绝大多数普通广播(比如你自己定义的广播),只有在注册完成之后收到新发送的广播时,才会触发onReceive。但有一种特殊情况——粘性广播(Sticky Broadcast),这类广播会被系统“留存”下来,当你注册对应接收器的瞬间,系统就会把最近的一条该类型广播推送给你,这时候onReceive就会立刻执行。
举个实际例子:系统的ACTION_BATTERY_CHANGED就是典型的粘性广播,你一注册,onReceive马上就会被调用,因为系统一直保存着当前的电池状态广播。但如果你注册的是自己发的普通广播,那只有在注册后主动发送广播,接收器才会有反应。
2. 每次在onResume方法中调用registerBroadcastReceiver注册WiFi状态BroadcastReceiver时,该接收器都会被触发,这是默认行为吗?
没错,这就是系统的默认行为,因为WiFi状态相关的系统广播(比如WIFI_STATE_CHANGED_ACTION或者NETWORK_STATE_CHANGED_ACTION)都属于粘性广播。
系统会实时维护当前的WiFi状态,并且把最新的状态广播保留为粘性广播。所以每次你在onResume里注册这个接收器时,系统会自动把当前的WiFi状态广播发送给你的接收器,导致onReceive被触发。
如果不想每次注册都触发重复逻辑,可以做个小优化:比如在接收器里记录上次接收到的WiFi状态,当新状态和旧状态一致时,就跳过后续的处理逻辑;或者你也可以调整注册时机,但onResume其实是绑定页面生命周期注册动态广播的合理时机,不建议随便改。
内容的提问来源于stack exchange,提问作者Florian Walther
相关产品推荐
相关产品推荐

