使用LocalBroadcastManager在onResume上更新UI

时间:2018-06-09 12:17:33

标签: android android-intent android-service localbroadcastmanager

我有一个服务经常通过LocalBroadCastManager传递值来更新主活动UI。在服务中触发以下方法以将值传递给主要活动:

private void updateUI(String statusValue){

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

在主要活动中,我添加了一个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 
            }
        }
    }
};

当用户导航到另一个活动时,广播的接收者未注册,因为用户不会看到UI。然后onResume()当用户返回活动时,重新注册接收者:

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

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

case PAUSE_SERVICE :

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

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

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

这很好用,但是我注意到UI没有更新,因为在活动暂停时接收器未注册。

尽管暂停,是否可以继续这些UI更新?或者,一旦活动恢复,是否可以应用UI更新?

1 个答案:

答案 0 :(得分:0)

  

当用户导航到另一个活动时,接收者为   广播未注册,因为用户不会看到UI。

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

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

  • 将服务绑定在onResume() unBind() onStop() if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) { System.out.println("Time for party, because it is: " + date.getDayOfWeek()); } else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) System.out.println("Time for party, because it is: " + date.getDayOfWeek()); else { System.out.println("You should study! It is: " + date.getDayOfWeek()); }
  • 内部服务维护数据对象,它将保存最新数据。
  • 服务绑定后,通过Binder调用服务方法 将返回带有最新数据的数据对象。
  • 相应地更新活动中的数据。

您可以将此SO称为绑定/解除绑定服务