Java/Android倒計時(開始,暫停,恢復,停止)

由於要做暫停和恢復,這裏我就沒有使用Android的CountDownTimer,而是用了Java的Timer。所以,這個方法在java肯定是通用。我也外加了Android獨有的Service,有些計時器需要在Activiy關閉的情況下依然在計時,回到Activity時,顯示當前的計時狀態。

Timer 這個Java的類,具體看Java的API說明,但是要注意一點:

Timer 在cancel後,需要重新new 一次。

首先要給計時器定義三個狀態:準備,開始,暫停。

    public static final int PREPARE = 0;
    public static final int START = 1;
    public static final int PASUSE = 2;

1.準備:沒有開始計時,最初始狀態;

2.開始:已經開始倒計時

3.暫停:已經開始倒計時,而且用戶點擊了暫停


開始、恢復倒計時,我定義了這個方法:

    /**
     * start count down
     */
    private void startTimer(){
        timer = new Timer();
        timerTask = new MyTimerTask();
        timer.scheduleAtFixedRate(timerTask, 0, timer_unit);
    }

timer_unit 就是執行timer 任務的時間,我定義爲1秒。MyTimerTask是我定義的一個倒計時計算方法,如下:

    /**
     * count down task
     */
    private class MyTimerTask extends TimerTask{

        @Override
        public void run() {
            timer_couting -=timer_unit;
            if(timer_couting==0){
                cancel();
                initTimerStatus();
            }
            mHandler.sendEmptyMessage(1);
        }
    }
timer_couting 是一個變量,記錄當前倒計時還剩餘多少時間,當剩餘時間爲0時,倒計時結束,所以cancel結束倒計時。每次倒計一秒通過handler發送到主線程來更新ui提示倒計時信息。

在界面上定義兩個按鈕,一個開始,一個停止,開始後可以暫停,暫停後可以恢復。

          case R.id.btn_start:
                switch (timerStatus){
                    case CountDownTimerUtil.PREPARE:
                        startTimer();
                        timerStatus = CountDownTimerUtil.START;
                        btnStart.setText("PAUSE");
                        break;
                    case CountDownTimerUtil.START:
                        timer.cancel();
                        timerStatus = CountDownTimerUtil.PASUSE;
                        btnStart.setText("RESUME");
                        break;
                    case CountDownTimerUtil.PASUSE:
                        startTimer();
                        timerStatus = CountDownTimerUtil.START;
                        btnStart.setText("PAUSE");
                        break;
                }
                break;
            case R.id.btn_stop:
                if(timer!=null){
                    timer.cancel();
                    initTimerStatus();
                    mHandler.sendEmptyMessage(1);
                }

對於Android應用中需要用到關閉了Activity後依然在計時,在這裏我們需要用Service,定義Service的情況跟上面類同,但是要注意的是這個計時Service是要單例模式,保證每次倒計時進來都是同一個倒計時。還需要定義一些方法來讓Activity給這個Service傳遞操作命令,開始,暫停,恢復,停止。

    /**
     * start
     */
    public void startCountDown(){
        startTimer();
        timerStatus = CountDownTimerUtil.START;
    }

    /**
     * paust
     */
    public void pauseCountDown(){
        timer.cancel();
        timerStatus = CountDownTimerUtil.PASUSE;
    }

    /**
     * stop
     */
    public void stopCountDown(){
        if(timer!=null){
            timer.cancel();
            initTimerStatus();
            mCountDownTimerListener.onChange();
        }
    }
在Activity裏面獲取這個Service

countDownTimerService = CountDownTimerService.getInstance(new MyCountDownLisener()
                ,service_distination_total);

項目源碼:https://github.com/arjinmc/Android-CountDownTimer







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章