Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时

自定义倒计时类

public class CountDownTimerSupport implements ITimerSupport {
private Timer mTimer;

private Handler mHandler;

/**
* 倒计时时间
*/
private long mMillisInFuture;

/**
* 间隔时间
*/
private long mCountDownInterval;
/**
* 倒计时剩余时间
*/
private long mMillisUntilFinished;

private OnCountDownTimerListener mOnCountDownTimerListener;

private TimerState mTimerState = TimerState.FINISH;

@Deprecated
public CountDownTimerSupport() {
this.mHandler = new Handler();
}

public CountDownTimerSupport(long millisInFuture, long countDownInterval) {
this.setMillisInFuture(millisInFuture);
this.setCountDownInterval(countDownInterval);
this.mHandler = new Handler();
}

@Override
public void start() {
//防止重复启动 重新启动要先reset再start
if (mTimer == null && mTimerState != TimerState.START) {
mTimer = new Timer();
mTimer.scheduleAtFixedRate(createTimerTask(), 0, mCountDownInterval);
mTimerState = TimerState.START;
}
}

@Override
public void pause() {
if (mTimer != null && mTimerState == TimerState.START) {
cancelTimer();
mTimerState = TimerState.PAUSE;
}
}

@Override
public void resume() {
if (mTimerState == TimerState.PAUSE) {
start();
}
}

@Override
public void stop() {
if (mTimer != null) {
cancelTimer();
mMillisUntilFinished = mMillisInFuture;
mTimerState = TimerState.FINISH;

mHandler.post(new Runnable() {
@Override
public void run() {
if (mOnCountDownTimerListener != null) {
mOnCountDownTimerListener.onFinish();
}
}
});
}
}

@Override
public void reset() {
if (mTimer != null) {
cancelTimer();
}
mMillisUntilFinished = mMillisInFuture;
mTimerState = TimerState.FINISH;
}


private void cancelTimer() {
mTimer.cancel();
mTimer.purge();
mTimer = null;
}

public boolean isStart() {
return mTimerState == TimerState.START;
}

public boolean isFinish() {
return mTimerState == TimerState.FINISH;
}

/**
* @deprecated 使用构造方法
* @param millisInFuture
*/
@Deprecated
public void setMillisInFuture(long millisInFuture) {
this.mMillisInFuture = millisInFuture;
this.mMillisUntilFinished = mMillisInFuture;
}

/**
* @deprecated 使用构造方法
* @param countDownInterval
*/
@Deprecated
public void setCountDownInterval(long countDownInterval) {
this.mCountDownInterval = countDownInterval;
}

public void setOnCountDownTimerListener(OnCountDownTimerListener listener) {
this.mOnCountDownTimerListener = listener;
}

public long getMillisUntilFinished() {
return mMillisUntilFinished;
}

public TimerState getTimerState() {
return mTimerState;
}

/**
* @param millisInFuture
* @param countDownInterval
* @return
* @deprecated 已更换Timer
*/
@Deprecated
protected CountDownTimer createCountDownTimer(long millisInFuture, long countDownInterval) {
return null;
}

protected TimerTask createTimerTask() {
return new TimerTask() {
private long startTime = -1;

@Override
public void run() {
if (startTime < 0) {
//第一次回调 记录开始时间

startTime = scheduledExecutionTime() - (mMillisInFuture - mMillisUntilFinished);

mHandler.post(new Runnable() {
@Override
public void run() {
if (mOnCountDownTimerListener != null) {
mOnCountDownTimerListener.onTick(mMillisUntilFinished);
}
}
});
} else {
//剩余时间
mMillisUntilFinished = mMillisInFuture - (scheduledExecutionTime() - startTime);

mHandler.post(new Runnable() {
@Override
public void run() {
if (mOnCountDownTimerListener != null) {
mOnCountDownTimerListener.onTick(mMillisUntilFinished);
}
}
});
if (mMillisUntilFinished <= 0) {
//如果没有剩余时间 就停止
stop();
}
}
}
};
}

}

 

初始化

private CountDownTimerSupport mTimer;

mTimer = new CountDownTimerSupport(duration * 1000, 1000);

mTimer.setOnCountDownTimerListener(new OnCountDownTimerListener() {
@Override
public void onTick(long millisUntilFinished) {
tv.setText(millisUntilFinished + "ms\n" + millisUntilFinished / 1000 + "s");//倒计时
// textView.setText((60 * 1000 - millisUntilFinished) / 1000 + "S");//正计时
Log.d("CountDownTimerSupport", "onTick : " + millisUntilFinished + "ms");
}

@Override
public void onFinish() {
tv.setText("已停止");
Log.d("CountDownTimerSupport", "onFinish");
}
})

启动

mTimer.start();
暂停

mTimer.pause();
继续

mTimer.resume();
停止

mTimer.stop();
重复启动,重设时长

mTimer.reset();//重复启动
// mTimer.setMillisInFuture(30000);//重设时长
mTimer.start();//重复启动

/ 发送带有数据的广播
private void broadcastUpdate(final String action, String time) {
final Intent intent = new Intent(action);
intent.putExtra("time", time);
sendBroadcast(intent);
}
// 发送广播方法——更新倒计时
broadcastUpdate(IN_RUNNING, time / 1000 + "");


// 关闭服务,停止倒计时
Intent countDownIntent = new Intent(MainActivity.this, CodeTimerService.class);
stopService(countDownIntent);
finish();


原文链接:https://blog.csdn.net/meixi_android/article/details/106468417

posted @ 2022-05-05 15:38  stdxxd  阅读(1092)  评论(0)    收藏  举报