Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建后台(前台?)服务,计算整个应用程序生命周期中的时间并更新ui(如endomondo)_Java_Android_Android Studio_Background Service - Fatal编程技术网

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

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

我想做一块像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);
    }
};