Обновите пользовательский интерфейс в onResume, используя LocalBroadcastManager - PullRequest
0 голосов
/ 09 июня 2018

У меня есть служба, которая часто обновляет основной интерфейс активности, передавая значения через 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;

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

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

1 Ответ

0 голосов
/ 09 июня 2018

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

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

Так как не рекомендуется регистрировать получателя, одним из решений будет:

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

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

...