【发布时间】:2016-09-12 13:54:23
【问题描述】:
在我的 Android 应用中,有一个服务执行长时间运行的任务(例如播放音乐),它可以处于以下两种状态之一:运行或暂停。有一个“暂停/恢复”图像按钮可以暂停/恢复任务。由于其他原因(不是来自 UI),任务也可能被暂停。根据任务的当前状态(运行或暂停),按钮的外观应有所不同。所以我需要将按钮图像与任务的实际状态同步。
现在我想出了以下解决方案:
我的服务有静态的 pause 和 resume 方法,它们像这样向自己发送意图:
public static void pause(Context context) {
Intent intent = new Intent(context, MyService.class);
intent.putExtra("PAUSE", true);
context.startService(intent);
}
public static void resume(Context context) {
Intent intent = new Intent(context, MyService.class);
intent.putExtra("RESUME", true);
context.startService(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getBooleanExtra("PAUSE", false)) {
doPause();
} else if (intent.getBooleanExtra("RESUME", false)) {
doResume();
}
return START_STICKY;
}
由于doPause()和doResume()也可以从其他地方调用,所以在调用MyService.pause()/MyService.resume()时不能只给ImageButton设置图片:按钮图片和任务的实际状态可能变得不同步。相反,我使用 LocalBroadcastManager 在应该更新按钮时通知活动:
public void doPause() {
paused = true;
... // Do some stuff to pause the service
// Notify about state change
Intent intent = new Intent("SERIVCE_STATE_CHANGED");
intent.putExtra("PAUSED", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
doResume() 的代码类似。
所以,我的活动注册了接收者并将图像设置在onReceive()。
该解决方案似乎有效。但我的问题是是否有更好/更简单的方法来实现相同的目标?有什么最佳做法吗?
【问题讨论】:
标签: android service localbroadcastmanager