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

我想像在endmondo中制作秒表。当我们启动应用程序时,它应该计算时间并在主要活动中更新textView(实际上是一个片段)。

我做了后台服务(例如here),但是很好,它没有用。当我将活动更改为另一个活动时,服务正在从0开始计数时间。问题是,实现此活动的正确方法是什么?现在,我有可能必须复制与Endmondo计数器类似的行为,即无论何时我们更改活动或最小化应用程序,当我们开始训练时,它始终计数时间。我也尝试使用前台服务执行此操作,但可悲的是,我读到无法从中更新ui。我正在使用API​​级别24。

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

chenglong767 回答:创建计数时间的后台(前景?)服务并在整个应用程序生命周期中更新ui(例如在endomondo中)

创建前台服务并使用countDown计时器。然后每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;
}

并且在广播/接收器寄存器之后的活动/片段中使用此代码。

 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);
    }
};
本文链接:https://www.f2er.com/3150463.html

大家都在问