我想像在Endmondo中制作秒表。当我们启动应用程序时,它应该计算时间并在主要活动中更新textView(实际上是一个片段)。
我做了后台服务(例如here),但是很好,它没有用。当我将活动更改为另一个活动时,服务正在从0开始计数时间。问题是,实现此活动的正确方法是什么?现在,我有可能必须重现与Endmondo计数器类似的行为,即无论何时我们更改活动或最小化应用程序,当我们开始训练时,它始终计数时间。我也尝试使用前台服务执行此操作,但可悲的是,我读到无法从中更新ui。我正在使用API级别24。
处理此问题的正确方法是什么?
创建前台服务并使用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);
}
};