我们使用广播来传达远程服务和我们的用户界面之间的状态变化。这样做,我们发现了一个非常奇怪的行为:有时(我找不到任何线索为什么)这些广播延迟了大约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输出。尝试在不同的设备(万普拉斯3 7.1.1,6.0.1 Z3,S7边缘7.1.1),都显示相同的行为
我认为这可能与:Android network state change detection takes time
还有一个问题,在Android的问题跟踪它:https://issuetracker.google.com/issues/62298626 – noongiya95