Трансляции задерживаются

Мы используем широковещательные передачи, чтобы сообщать об изменениях состояния между удаленными службами и нашим пользовательским интерфейсом. При этом мы обнаружили очень странное поведение: иногда (я не могу понять, почему) эти трансляции задерживаются примерно на 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 требует времени


person Mike Kasperlik    schedule 13.06.2017    source источник
comment
Для него также есть проблема в системе отслеживания проблем Android: issueetracker.google.com/issues/62298626   -  person mbo    schedule 13.06.2017


Ответы (1)


После нескольких часов поиска ответа я нашел? решение после публикации этого.

Похоже, что добавление флага FLAG_RECEIVER_FOREGROUND к намерению полностью устраняет эту задержку. Было бы неплохо узнать, почему это происходит, и является ли это хорошим «исправлением» или я уничтожу этим что-то еще.

Это помогает:

    intent.setFlags(FLAG_RECEIVER_FOREGROUND);

Если установлено, при отправке широковещательной рассылки получателю разрешено работать с приоритетом переднего плана с более коротким интервалом тайм-аута. Во время обычного вещания приемники не выводятся автоматически из фонового класса приоритета.

Источник: https://developer.android.com/reference/android/content/Intent.html#FLAG_RECEIVER_FOREGROUND

person Mike Kasperlik    schedule 13.06.2017
comment
У меня не получилось ... - person linux_art; 09.04.2021