效果圖:
封裝好的工具類: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,表示非第一次啓用,倒計時正在運行中
}