我有一个在RecyclerView中显示的任务列表。 对于每个任务,我提出一个包含以下内容的活动:
用户可以停止任务以便稍后恢复并同时启动各种任务。
我需要实施一项服务,以保证每个天文台在任务的生命周期内在后台运行。
我遵循了这里的指南:https://developer.android.com/guide/components/services.html
如何为每个任务创建一个唯一的服务,并在用户选择上一个任务时显示计时器(带有经过的时间)。 什么是逐秒更新活动的正确方法?
public class TaskService extends Service {
public static final String TAG = "TASK SERVICE";
public static final String ACTION_TIMER = TaskService.class.getName() + "TIMER";
private IBinder mBinderTask = new TimerTaskBinder();
private Chronometer mChronometer;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommande: ");
mChronometer = new Chronometer(this);
mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.start();
return START_STICKY; // Will be explicity started and stopped
}
public String getTimestamp() {
long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();
int hours = (int) (elapsedMillis / 3600000);
int minutes = (int) (elapsedMillis - hours * 3600000) / 60000;
int seconds = (int) (elapsedMillis - hours * 3600000 - minutes * 60000) / 1000;
int millis = (int) (elapsedMillis - hours * 3600000 - minutes * 60000 - seconds * 1000);
return hours + ":" + minutes + ":" + seconds + ":" + millis;
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: ");
return mBinderTask;
}
public class TimerTaskBinder extends Binder {
public TaskService getService() {
return TaskService.this;
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
}
由于
答案 0 :(得分:0)
我不会为了跟踪计时器而创建服务。我建议使用SystemClock.elapsedRealtime()
存储任务的开始时间和预期停止时间,并且只要在每次回收者视图可见时将计时时间设置为计时器。
答案 1 :(得分:0)
不要为每项任务创建Service
。只需创建一个Service
并让它管理任务列表。
要在Service
和Activity
之间进行通信,您有多种选择:
BroadcastReceiver
。您的Activity
会创建BroadcastReceiver
,并会监听Service
间隔发送的广播。 Service
调用sendBroadcast()
来广播感兴趣的事件。提示:如果您的Activity
和Service
在同一个操作系统进程中运行,则可以使用LocalBroadcastManager
(效率更高一些)。Service
。将Activity
绑定到Service
,Service
可以根据需要回复Activity
中的方法。EventBus
库那样实现。