创建计算时间的后台(前台?)服务并在整个应用程序生命周期内更新 ui(如在 endomondo 中)

Creating background (foreground?) service that counts time and updating ui throughout whole application life (like in endomondo)

我想像 endomondo 一样制作秒表。当我们启动应用程序时,它应该计算时间并更新 main activity 中的 textView(实际上它是一个片段)。

我做了后台服务(比如 here)但是,它没有用。当我将 activity 更改为另一个时,服务从 0 开始计算时间。问题是,实现它的正确方法是什么?我现在有可能,我必须重现与 endomondo 计数器类似的行为,当我们开始训练时,无论我们是否更改 activity 或最小化应用程序,它都会一直计算时间。我也尝试过使用前台服务来做到这一点,但遗憾的是我读到我无法从中更新 ui 。我正在研究 API 24 级。

处理这个问题的正确方法是什么?

创建前台服务并使用倒计时计时器。然后每 1 秒发送一次广播以更改 ui。 如果您希望您的应用在 android 8 及更高版本时在后台运行,您应该发送带有服务的通知以向用户显示您的应用正在执行任务。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {



    int milliseconds = 100* 1000;

    new CountDownTimer(milliseconds, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {

            Intent intent = new Intent("timer_tracking");
            intent.putExtra("timer", millisUntilFinished);
            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

        }

        @Override
        public void onFinish() {

            stopSelf();
        }
    }.start();


    return START_STICKY;
}

并在 activity/fragment 注册后 broadcast_receiver 使用此代码。

 public BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @SuppressLint("DefaultLocale")
    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(MainActivity.this, "broad", Toast.LENGTH_LONG).show();

        long millisUntilFinished = intent.getLongExtra("timer", 0);

        String counter = String.format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
                TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));


        textView.setText(counter);
    }
};