【问题标题】:Android service interactionsAndroid 服务交互
【发布时间】:2018-03-06 21:57:42
【问题描述】:

我有一个显示在 RecyclerView 中的任务列表。 对于每项任务,我都会展示一个包含以下内容的活动:

  • 点击时显示计时器的播放按钮
  • 完成按钮表示任务已完成并停止绑定到活动的服务。
  • 各种信息

用户可以停止任务以稍后恢复它并同时启动各种任务。

我需要实现一个服务来让每个计时器在任务的生命周期内都在后台运行。

我遵循了这里的指导方针:https://developer.android.com/guide/components/services.html

当用户选择上一个任务时,如何为每个任务创建一个独特的服务并显示计时器(以及经过的时间)。 每秒更新 Activity 的正确方法是什么?

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: ");

    }
}

谢谢

【问题讨论】:

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


    【解决方案1】:

    我不会为了跟踪计时器而创建服务。我建议使用SystemClock.elapsedRealtime() 存储任务的开始时间和预计停止时间,并在每次recyclerview 变得可见时将计算出的剩余时间设置为计时器。

    【讨论】:

    • 当我了解如何与服务交互时,我计划收集其他数据,例如用户位置和移动
    • 当您说运动时,您是指用户活动(步行、驾驶等)吗?
    • 是 GPS 监控
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2013-04-07
      • 2019-08-02
      相关资源
      最近更新 更多