Android服务互动

时间:2017-09-25 20:19:45

标签: android multithreading android-activity binding android-service

我有一个在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: ");

    }
}

由于

2 个答案:

答案 0 :(得分:0)

我不会为了跟踪计时器而创建服务。我建议使用SystemClock.elapsedRealtime()存储任务的开始时间和预期停止时间,并且只要在每次回收者视图可见时将计时时间设置为计时器。

答案 1 :(得分:0)

不要为每项任务创建Service。只需创建一个Service并让它管理任务列表。

要在ServiceActivity之间进行通信,您有多种选择:

  • 使用BroadcastReceiver。您的Activity会创建BroadcastReceiver,并会监听Service间隔发送的广播。 Service调用sendBroadcast()来广播感兴趣的事件。提示:如果您的ActivityService在同一个操作系统进程中运行,则可以使用LocalBroadcastManager(效率更高一些)。
  • 使用绑定的Service。将Activity绑定到ServiceService可以根据需要回复Activity中的方法。
  • 使用"事件总线"像Green Robot的EventBus库那样实现。