Android 服务交互
Posted
技术标签:
【中文标题】Android 服务交互【英文标题】:Android service interactions 【发布时间】: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: ");
谢谢
【问题讨论】:
【参考方案1】:我不会为了跟踪计时器而创建服务。我建议使用SystemClock.elapsedRealtime()
存储任务的开始时间和预计停止时间,并在每次recyclerview 变得可见时将计算出的剩余时间设置为计时器。
【讨论】:
当我了解如何与服务交互时,我计划收集其他数据,例如用户位置和移动 当您说运动时,您是指用户活动(步行、驾驶等)吗? 是 GPS 监控【参考方案2】:不要为每个任务创建Service
。只需创建一个Service
并让它管理任务列表。
要在Service
和Activity
之间进行通信,您有多种选择:
BroadcastReceiver
。您的Activity
创建一个BroadcastReceiver
并监听您的Service
每隔一段时间发送的广播。 Service
调用sendBroadcast()
来广播感兴趣的事件。提示:如果你的Activity
和Service
在同一个操作系统进程中运行,你可以使用LocalBroadcastManager
(效率更高一点)。
使用绑定Service
。将Activity
绑定到Service
,Service
可以根据需要回调Activity
中的方法。
使用像 Green Robot 的 EventBus
库这样的“事件总线”实现。
【讨论】:
以上是关于Android 服务交互的主要内容,如果未能解决你的问题,请参考以下文章
Android客户端采用Http 协议Post方式请求与服务端进行数据交互