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 并让它管理任务列表。

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

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

【讨论】:

以上是关于Android 服务交互的主要内容,如果未能解决你的问题,请参考以下文章

android客户端和服务器端怎么交互

Android使用https与服务器交互的正确姿势

Android客户端采用Http 协议Post方式请求与服务端进行数据交互

设置在线服务器数据库并编写我的 android 本机应用程序以与之交互

android + php 后台开发

Android 使用JSON格式与服务器交互 中文乱码问题解决