Chronometer持续运行

Android 使用Chronometer,但退出Chronometer所在的界面,Chronometer就会自动停止。
如何使Chronometer退出界面后仍在继续计时


 begin1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if(isChecked){
    chronometer.start();// 开始计时
    chronometer.setBase(SystemClock.elapsedRealtime()-recordingTime);

    }
    if(!isChecked){
    chronometer.stop();// 停止计时
    recordingTime=SystemClock.elapsedRealtime()-chronometer.getBase();
    recordingTime1=recordingTime/1000;
    sprent= (float) (0.1*recordingTime1);
    }

该回答引用chatgpt:可能需要调整一下
在Android中,当Activity退出时,所有的UI组件都会被销毁,这也包括Chronometer。如果希望Chronometer能够在退出当前Activity后继续计时,可以将其与Service绑定,然后在Service中进行计时。

下面是一种实现方式:

1.创建一个继承自Service的类MyService,并在该类中定义计时器:

public class MyService extends Service {
    private Handler mHandler = new Handler();
    private long mStartTime;
    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            long millis = System.currentTimeMillis() - mStartTime;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;
            String time = String.format("%02d:%02d", minutes, seconds);
            // 将计时器的值通过Broadcast发送给Activity
            Intent intent = new Intent("com.example.broadcast.CHANGE_TIME");
            intent.putExtra("time", time);
            sendBroadcast(intent);
            mHandler.postDelayed(this, 1000);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        mStartTime = System.currentTimeMillis();
        mHandler.postDelayed(mRunnable, 0);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}


在Activity中启动MyService,并通过Broadcast接收计时器的值

public class MainActivity extends AppCompatActivity {
    private Chronometer mChronometer;
    private TextView mTextView;
    private MyReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mChronometer = findViewById(R.id.chronometer);
        mTextView = findViewById(R.id.text_view);

        // 启动Service
        Intent intent = new Intent(this, MyService.class);
        startService(intent);

        // 注册BroadcastReceiver
        mReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.example.broadcast.CHANGE_TIME");
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 停止Service
        Intent intent = new Intent(this, MyService.class);
        stopService(intent);
        // 注销BroadcastReceiver
        unregisterReceiver(mReceiver);
    }

    private class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String time = intent.getStringExtra("time");
            mTextView.setText(time);
        }
    }
}


在上面的代码中,我们创建了一个继承自BroadcastReceiver的类MyReceiver,并在其中实现了onReceive方法。当Service发送的Broadcast被接收到时,onReceive方法就会被调用,然后我们可以将计时器的值更新到UI组件中。同时,在Activity销毁时,需要停止Service,并注销BroadcastReceiver

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^