在我的 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()
anddoResume()
也可以从其他地方调用,所以我不能在调用MyService.pause()
/时将图像设置为 ImageButton MyService.resume()
:按钮图像和任务的实际状态可能会变得不同步。相反,我使用 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()
.
该解决方案似乎有效。但我的问题是是否有更好/更简单的方法来实现相同的目标?有什么最佳实践吗?