我有一个服务经常通过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更新?
答案 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());
}
。 您可以将此SO称为绑定/解除绑定服务