我们使用广播来传达远程服务和 UI 之间的状态更改。这样做时,我们发现了一个非常奇怪的行为:有时(我找不到任何线索为什么)这些广播会延迟 8 秒左右。
我们如何发送它们(非常基本,mState
只是一个枚举)(服务中的远程进程):
Intent intent = new Intent();
intent.setAction(ACTION_STATE_CHANGED);
intent.putExtra(EXTRA_STATE, mState);
Service.get().sendBroadcast(intent, null);
静态接收器如何注册(App):
<receiver android:name=".ServiceStateReceiver">
<intent-filter>
<action android:name="service.intent.action.STATE_CHANGE" />
</intent-filter>
</receiver>
接收器类(App):
public class ServiceStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("State", "State via static received");
}
}
现在有时会延迟(总是针对相同的州)
状态枚举:
public enum State {
DISCONNECTED,
BT_DISABLED,
BT_SCANNING,
BT_TIMEOUT,
BT_FAILURE,
BT_LOCATION_NEEDED,
CONNECTING,
ACTIVATION_FAILURE,
VIN_NEEDED,
CAR_MODEL_NEEDED,
MILEAGE_NEEDED,
READY,
IGNITION_OFF,
IGNITION_ON;
@Override
public String toString() {
return name();
}
}
现在出现了奇怪的部分:如果我注册一个动态接收器,我们总是立即在那里接收所有广播。静态的仍然有很大的延迟。如果我通过发送广播sendOrderedBroadcast
两者(静态和动态)都有这种延迟。
动态接收器:
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("State", "State via dynamic received");
}
}, new IntentFilter(State.ACTION_STATE_CHANGED));
到目前为止我尝试过的:
- 从主线程/工作线程发送广播(没有改变)
- 使用权限属性(没有改变)
- 连续多次发送广播(不改变任何内容,现在只是获得多个延迟广播)
另外: logcat 没有似乎相关的输出。在不同的设备上尝试(OnePlus 3 7.1.1、Z3 6.0.1、S7 Edge 7.1.1),均显示相同的行为
我认为这可能是相关的:Android网络状态变化检测需要时间 https://stackoverflow.com/questions/25305698/android-network-state-change-detection-takes-time