使用 LocalBroadcastManager 在 onResume 更新 UI

Update UI at onResume using LocalBroadcastManager

我有一项服务经常通过 LocalBroadCastManager 传递值来更新 Main Activity UI。在服务中触发以下方法将值传递给 Main Activity:

private void updateUI(String statusValue){

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

在 Main Activity 中,我添加了一个 BroadcastReceiver 来获取值并相应地更新 UI:

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 
            }
        }
    }
};

当用户导航到另一个 activity 时,广播的接收器被取消注册,因为用户不会看到 UI。然后 onResume() 当用户 returns 到 activity 接收者重新注册时:

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

更新: 当 activity 暂停时,用户可以通过单击正在进行的通知上的 Pending Intents 来执行操作(例如 'Pause')。此操作在服务的 onStartCommand() 中处理:

case PAUSE_SERVICE :

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

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

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

这工作正常,但是我注意到 UI 没有更新,因为接收器未注册,而 activity 暂停。

是否可以在暂停的情况下继续这些 UI 更新?或者是否可以在 activity 恢复后立即应用 UI 更新?

When the user navigates to another activity the receiver for the Broadcasts is unregistered as the user wont see the UI.

这就是您的 Activity 数据不是最新的原因。由于广播接收器未注册,服务发送的数据将不会被接收。

由于保持接收器注册不是一个好主意,一个解决方案是:

  • onResume() 上绑定服务,在 onStop() 上绑定服务 unBind()
  • 内部服务维护数据对象,它将保存最新数据。
  • 服务绑定后,通过Binder调用服务方法 将 return 具有最新数据的数据对象。
  • 相应地更新 Activity 中的数据。

您可以参考此 SO 以获得 binding/unbinding 服务