Мы используем широковещательные передачи, чтобы сообщать об изменениях состояния между удаленными службами и нашим пользовательским интерфейсом. При этом мы обнаружили очень странное поведение: иногда (я не могу понять, почему) эти трансляции задерживаются примерно на 8 секунд.
Как мы их отправляем (довольно просто, mState
- это просто перечисление) (удаленный процесс в сервисе):
Intent intent = new Intent();
intent.setAction(ACTION_STATE_CHANGED);
intent.putExtra(EXTRA_STATE, mState);
Service.get().sendBroadcast(intent, null);
Как регистрируется статический приемник (приложение):
<receiver android:name=".ServiceStateReceiver">
<intent-filter>
<action android:name="service.intent.action.STATE_CHANGE" />
</intent-filter>
</receiver>
Класс приемника (приложение):
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 требует времени