Обновите пользовательский интерфейс в onResume с помощью LocalBroadcastManager

У меня есть служба, которая часто обновляет пользовательский интерфейс основного действия, передавая значения через LocalBroadCastManager. В Службе запускается следующий метод для передачи значения в Основное действие:

private void updateUI(String statusValue){

        broadcastIntent.putExtra("status", statusValue);
        LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
    }

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

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Get extra data included in the Intent
        String brStatus = intent.getStringExtra("status");

        if(brStatus != null){

            //Update UI 
            }
        }
    }
};

Когда пользователь переходит к другому действию, получатель широковещательных сообщений не регистрируется, поскольку пользователь не видит пользовательский интерфейс. Затем onResume(), когда пользователь вернется к активности, получатель будет повторно зарегистрирован:

LocalBroadcastManager.getInstance(this)
                .registerReceiver(mMessageReceiver, new IntentFilter("speed-stats"));

ОБНОВЛЕНИЕ: пока действие приостановлено, пользователь может выполнять действия (например, «Пауза»), нажимая «Ожидающие намерения» в текущем уведомлении. Это действие обрабатывается внутри onStartCommand () Службы:

case PAUSE_SERVICE :

                    Log.i(LOG_TAG, "Pause Foreground service.");

                    startForeground(NOTIF_ID,makeNotification(isRunning = false));

                    updateUI("paused");
                    stopSpeed();
                    break;

Это работает нормально, однако я заметил, что пользовательский интерфейс не обновляется, поскольку получатель не зарегистрирован, пока действие приостановлено.

Можно ли продолжить эти обновления пользовательского интерфейса, несмотря на паузу? Или можно применить обновления пользовательского интерфейса сразу после возобновления деятельности?


person T Terje    schedule 09.06.2018    source источник
comment
Извините, но вы не предоставили достаточно исходного кода для решения вашей проблемы. Сделай это, пожалуйста.   -  person jantursky    schedule 09.06.2018
comment
@jantursky без проблем, добавлен дополнительный код, чтобы показать, что делает BroadcastReceiver.   -  person T Terje    schedule 09.06.2018


Ответы (1)


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

Это причина того, что данные о вашей деятельности не актуальны. Поскольку широковещательный приемник не зарегистрирован, данные, отправленные службой, не будут получены.

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

  • Привяжите службу к onResume() и unBind() к onStop().
  • Внутренний сервис поддерживает объект данных, в котором будут храниться самые свежие данные.
  • После связывания службы вызовите метод службы через Binder, который вернет объект данных с последними данными.
  • Соответственно обновите данные в своей деятельности.

Вы можете сослаться на этот SO для привязки / отмены привязки.

person Sagar    schedule 09.06.2018
comment
Спасибо за ваш ответ. По вашему совету я установил, что это запущенная служба и привязана к основному действию onStart(). При привязке он вызывает метод getState() для обновления состояния кнопки (приостановлено / запущено). Это работает, однако я также хотел бы непрерывно передавать значения скорости из службы в основное действие, когда служба была запущена. Можно ли передавать эти значения непрерывно? Из того, что я вижу до сих пор, когда он привязан, только активность может делать запросы к службе. - person T Terje; 10.06.2018
comment
@InspectorNorse Привязка к службе предназначена только для одноразового использования (получить текущее состояние после возобновления). Как только данные обновятся, продолжайте использовать LocalBroadcastReceiver для будущих обновлений значений и позвольте сервису транслировать его. - person Sagar; 10.06.2018