首页 > 解决方案 > 如果java中有旧的毫秒,如何计算提供的当前毫秒

问题描述

我在我的 android 应用程序中制作了一个计时器。我有一个场景,即使应用程序关闭,我也不需要停止计时器。如果计时器正在运行并且用户关闭应用程序并在一段时间后重新打开它。他应该在计时器上看到最晚的时间。但目前我无法显示最新时间。我只能显示用户杀死应用程序的时间。我正在存储计时器的时间,当用户打开应用程序时,我将存储的时间放回计时器。但我想显示最新的时间。这是我到目前为止所做的。我正在使用计时器小部件。

MainActivity.class:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = MainActivity.class.getSimpleName();
    Chronometer tvTextView;
    Button btnStart, btnStop;
    private int state = 0; //0 means stop state,1 means play, 2 means pause

    SharedPreferences sharedPreferences;
    private boolean running = false;
    private long pauseOffSet = -1;

    ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvTextView = findViewById(R.id.textview);
        progressBar = findViewById(R.id.puzzleProgressBar);

        btnStart = findViewById(R.id.button1);
        btnStop = findViewById(R.id.button2);
        btnStart.setOnClickListener(this);
        btnStop.setOnClickListener(this);

        sharedPreferences = getSharedPreferences("myprefs", MODE_PRIVATE);
        state = sharedPreferences.getInt("state", 0);

        tvTextView.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                long time = SystemClock.elapsedRealtime() - chronometer.getBase();
                pauseOffSet=time;
                Log.e(TAG,"pauseOffSet "+pauseOffSet);
                if (time >= 79200000) {
                    tvTextView.setBase(SystemClock.elapsedRealtime());
                    tvTextView.stop();
                    running = false;
                    progressBar.setProgress(0);
                } else {
                    chronometer.setText(setFormat(time));
                    int convertTime = (int) time;
                    progressBar.setProgress(convertTime);
                }
            }
        });

        if (state == 1) { // its in play mode
            running = true;
            tvTextView.setBase(SystemClock.elapsedRealtime() - sharedPreferences.getLong("milli", 0));
            tvTextView.start();
        } else if (state == 2) { //its in pause mode
            running = false;
            pauseOffSet = sharedPreferences.getLong("milli", -1);
            long time = SystemClock.elapsedRealtime() - pauseOffSet;
            tvTextView.setBase(time);
            int convertTime = (int) pauseOffSet;
            progressBar.setProgress(convertTime);
        } else {
            running = false;
            tvTextView.setBase(SystemClock.elapsedRealtime());
        }
    }

    public void onClick(View v) {
        if (btnStart == v) {
            if (!running) {
                if (pauseOffSet != -1) {
                    pauseOffSet = sharedPreferences.getLong("milli", -1);
                }
                tvTextView.setBase(SystemClock.elapsedRealtime() - pauseOffSet);
                tvTextView.start();
                state = 1;
                pauseOffSet = 0;
                running = true;
            }
        } else if (btnStop == v) {
            if (running) {
                tvTextView.stop();
                pauseOffSet = SystemClock.elapsedRealtime() - tvTextView.getBase();
                state = 2;
                running = false;
            }
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        sharedPreferences.edit().putLong("milli", pauseOffSet).commit();
        sharedPreferences.edit().putInt("state", state).commit();
    }

    @Override
    protected void onDestroy() {
        Log.e(TAG, "onDestroy called, state: " + state);
        super.onDestroy();
    }

    String setFormat(long time) {
        int h = (int) (time / 3600000);
        int m = (int) (time - h * 3600000) / 60000;
        int s = (int) (time - h * 3600000 - m * 60000) / 1000;
        String hh = h < 10 ? "0" + h : h + "";
        String mm = m < 10 ? "0" + m : m + "";
        String ss = s < 10 ? "0" + s : s + "";
        return hh + ":" + mm + ":" + ss;
    }
}

标签: javaandroidchronometer

解决方案


推荐阅读