【发布时间】:2017-06-13 08:31:46
【问题描述】:
我们使用广播在远程服务和我们的 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 network state change detection takes time
【问题讨论】:
-
Android 问题跟踪器中也有一个问题:issuetracker.google.com/issues/62298626
标签: android android-broadcastreceiver