短信发送倒计时按钮封装,退出再进入可继续倒计时,绝对时间倒计时

先上图:

主要类的代码:

/**
 * 用在获取短信验证码倒计时使用
 */
public class SMSCodeUtil{
	private TimerUtil tUtil;
	private int time;//倒计时时间
	private int past_time;//已经过去了的时间
	private int leave_time;//剩余的时间
	private String tag;
	private TextView view;
	/**
	 * 剩余时间的key
	 */
	private final static String LEAVE_KEY="leave_time";
	/**
	 * 当前时间的key
	 */
	private final static String NOW_KEY="now_time";
	
	public SMSCodeUtil(TextView view,String tag,int time){
		this.tag=tag;
		this.past_time=Integer.parseInt((System.currentTimeMillis()-(Long)SharedPreferencesHelper.get(NOW_KEY+this.tag, 0L))/1000+"");
		if(this.past_time<0){
			this.past_time=0;
		}
		this.leave_time=(Integer)SharedPreferencesHelper.get(LEAVE_KEY+this.tag, 0)-past_time;
		System.out.println("past_time="+past_time);
		System.out.println("leave_time="+leave_time);
		this.view=view;
		this.time=time;
	}
	
	private void setTimeStart(int start){
		if(tUtil==null){
			tUtil=new TimerUtil(start, 0, new TimerCallBack() {
				@Override
				public void timerCallBack(int now, boolean alive) {
					System.out.println(now);
					if(alive){
						SMSCodeUtilHandler.sendEmptyMessage(now);
					}else{
						SMSCodeUtilHandler.sendEmptyMessage(0);
					}

					SharedPreferencesHelper.put(LEAVE_KEY+tag, now);
					SharedPreferencesHelper.put(NOW_KEY+tag, System.currentTimeMillis());
				}
			});
			tUtil.startTimer();
		}else{
			tUtil.stopTimer();
			tUtil=null;
			setTimeStart(start);
		}
	}
	
	@SuppressLint("HandlerLeak") 
	private Handler SMSCodeUtilHandler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			if(msg.what==0){
				view.setText("重新发送");
				view.setEnabled(true);
			}else{
				view.setText("重新发送"+"("+msg.what+"s)");
			}
		}
	};
	
	public void restartTimer(){
		if(leave_time>0){
			if(leave_time>time){
				leave_time=(Integer)SharedPreferencesHelper.get(LEAVE_KEY+this.tag, 0);
			}
			view.setEnabled(false);
			setTimeStart(leave_time);
		}
	}
	
	public void startTimer(){
		view.setEnabled(false);
		setTimeStart(time);
	}
	
	public void stopTimer(){
		if(tUtil!=null)
			tUtil.stopTimer();
	}
}
倒计时封装类:

public class TimerUtil {
	private Timer timer=null;
	/**
	 * 递增还是递减的标识,0表示递减,1表示递增,默认递减
	 */
	private int order=0;
	
	private int start,end;
	private TimerCallBack timerCallBack;
	public TimerUtil(int start,int end,TimerCallBack timerCallBack) {
		this.start=start;
		this.end=end;
		this.timerCallBack=timerCallBack;
	}
	
	public TimerUtil(int start,int end,int order,TimerCallBack timerCallBack){
		this.start=start;
		this.end=end;
		this.timerCallBack=timerCallBack;
		this.order=order;
	}
	
	public void startTimer(){
		if(timer==null){
			timer=new Timer();
		}
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				if(order==0){
					start--;
					if(start<=end){
						timerCallBack.timerCallBack(start,false);
						stopTimer();
					}else{
						timerCallBack.timerCallBack(start,true);
					}
				}else if(order==1){
					start++;
					if(start>=end){
						timerCallBack.timerCallBack(start,false);
						stopTimer();
					}else{
						timerCallBack.timerCallBack(start,true);
					}
				}
			}
		}, 0,1000);
	}
	
	public void stopTimer(){
		if(timer!=null)
			timer.cancel();
	}
	
	public interface TimerCallBack{
		public void timerCallBack(int now,boolean alive);
	}
}
调用代码:

SMSCodeUtil sUtil=new SMSCodeUtil(button, "register", REGET_SMS_CODE_TIME);
sUtil.restartTimer();
代码下载: http://download.csdn.net/download/u012800952/10050762

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许天成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值