gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:20:21 27 4
gpt4 key购买 nike

我想制作像endonmondo那样的秒表。当我们启动应用程序时,它应该计算时间并更新主 Activity 中的textView(实际上它是一个 fragment )。

我做了后台服务(如 here ),但是,它不起作用。当我将 Activity 更改为另一个 Activity 时,服务从 0 开始计算时间。问题是,实现此操作的正确方法是什么?我现在有可能,我必须重现与 endemondo 计数器类似的行为,当我们开始训练时,无论我们是否更改 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;
}

并在注册broadcast_receiver后的 Activity/fragment 中使用此代码。

 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);
}
};

关于java - 创建后台(前台?)服务来计算时间并在整个应用程序生命周期中更新 ui(如 endemondo 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58734681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com