Java 创建后台(前台?)服务,计算整个应用程序生命周期中的时间并更新ui(如endomondo)
我想做一块像endomondo那样的秒表。当我们启动应用程序时,它应该计算时间并在主活动中更新textView,实际上它是一个片段 我做了后台服务,但很好,它没有工作。当我将活动更改为另一个活动时,服务正在从0开始计时。问题是,实施这一目标的正确方式是什么?我现在有可能,我必须复制与endomondo计数器类似的行为,即当我们开始训练时,无论我们是否改变活动或最小化应用程序,它始终计算时间。我也曾尝试使用前台服务来实现这一点,但遗憾的是,我读到我无法从中更新ui。我正在研究API级别24Java 创建后台(前台?)服务,计算整个应用程序生命周期中的时间并更新ui(如endomondo),java,android,android-studio,background-service,Java,Android,Android Studio,Background Service,我想做一块像endomondo那样的秒表。当我们启动应用程序时,它应该计算时间并在主活动中更新textView,实际上它是一个片段 我做了后台服务,但很好,它没有工作。当我将活动更改为另一个活动时,服务正在从0开始计时。问题是,实施这一目标的正确方式是什么?我现在有可能,我必须复制与endomondo计数器类似的行为,即当我们开始训练时,无论我们是否改变活动或最小化应用程序,它始终计算时间。我也曾尝试使用前台服务来实现这一点,但遗憾的是,我读到我无法从中更新ui。我正在研究API级别24 处理此
处理此问题的正确方法是什么?创建前台服务并使用倒计时。然后每1秒发送一次广播以更改用户界面。 若你们想让你们的应用程序在安卓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);
}
};