android倒計時封裝(活動進入後臺,倒計時依然能正常計時)

效果圖:

封裝好的工具類:TimeUtils.java

package com.xiao7.pump.Utils;

import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;

public class TimeUtils {
    /*倒計時時長  單位:秒*/
    public static int COUNT = 20*60;
    /*當前做*/
    private static int CURR_COUNT = 0;
    /*預計結束的時間*/
    private static long TIME_END = 0;
    /*計時器*/
    private static Timer countdownTimer;
    /*顯示倒計時的textView*/
    private static TextView txtCountdown;

    /**
     * 開始倒計時
     * @param isFirst 標識是否是第一次進入
     * @param second 倒計時時長  單位:秒
     * @param textView 顯示倒計時的textView
     */
    public static void startCountdown(boolean isFirst,int second,TextView textView) {
        COUNT = second;
        long data = System.currentTimeMillis();
        long time = TIME_END;
        //第一次進入時,重新賦值
        if(isFirst){
            CURR_COUNT = COUNT;
            time = data + COUNT * 1000;
            TIME_END = time;
        }else {
            int the_difference = ((int) (time - data)) / 1000;
            CURR_COUNT = the_difference;
        }
        //開始倒計時
        txtCountdown = textView;
        if (countdownTimer == null) {
            countdownTimer = new Timer();
            countdownTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    Message msg = new Message();
                    msg.what = CURR_COUNT--;
                    handler.sendMessage(msg);
                }
            }, 0, 1000);
            //第二個參數delay:"0"的意思是:無延遲
            //第三個參數period:"1000"的意思是:每隔多長時間調用一次(單位毫秒)
        }
    }

    /**
     * 結束倒計時
     */
    public static void stopCountdown() {
        //發送消息,結束倒計時
        Message message = new Message();
        message.what = 0;
        handler.sendMessage(message);
    }
    private static Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what <= 0) {
                if (countdownTimer != null) {
                    countdownTimer.cancel();
                    countdownTimer = null;
                }
                txtCountdown.setText("剩餘:00:00:00");
                txtCountdown.setEnabled(true);
            } else {
                //倒計時效果展示
                String txtTime = formatSecondTime(msg.what);
                txtCountdown.setText(txtTime);
                txtCountdown.setEnabled(false);
            }
            super.handleMessage(msg);
        }
    };
    
    /**
     * 時間格式化方法
     * @param second 秒數
     * @return
     */
    private static String formatSecondTime(int second) {
        int hour = 0;
        int minute = 0;
        if (second > 60) {
            minute = second / 60;   //取整
            second = second % 60;   //取餘
        }
        if (minute > 60) {
            hour = minute / 60;
            minute = minute % 60;
        }
        String strtime = "剩餘:"+hour+"小時"+minute+"分"+second+"秒";
        return strtime;
    }
}

 TimeUtils調用方式:

//在啓動倒計時的按鈕上
buttonStart.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //假設倒計20分鐘
        int secondTime=20*60;
        //倒計時   
        TimeUtils.startCountdown(true,secondTime,txtCountDown);
        //第一個參數爲true,表示剛啓動倒計時(第一次)
    }
});

 活動的生命週期onRestart()上重新調用,如下:

@Override
protected void onRestart() {
    super.onRestart();
    TimeUtils.startCountdown(false,secondTime,txtCountDown);
    //第一個參數爲false,表示非第一次啓用,倒計時正在運行中
}

 

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