Android 获取手机验证码倒计时功能
这是我的第二篇博文,打算准备把在公司平时遇到的问题或者比较常见的功能记录在博客中,第一是为了能够把解决过的问题积累起来,第二就是希望遇到与我类似功能的小伙伴可以给你们一点启发和帮助,那我们下面就进入正题。该篇文章主要介绍以下两个主要功能
- 倒计时功能
- 当倒计时未结束,重新进入该页面时,倒计时继续执行
倒计时功能
倒计时功能主要涉及的类是CountDownTimer,我们可以创建一个类CountTime去继承CountDownTimer类,此时需要重写它的两个方法和创建一个构造函数
class TimeCount extends CountDownTimer{
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long l) {
mButton.setClickable(false);
mButton.setBackgroundColor(ContextCompat.getColor(MainActivity.this,R.color.colorAccent));
mButton.setText(l/1000+"s后可重新获取验证码");
}
@Override
public void onFinish() {
mButton.setClickable(true);
mButton.setBackgroundColor(ContextCompat.getColor(MainActivity.this,R.color.colorPrimary));
mButton.setText("重新获取验证码");
}
}
首先我先介绍一下它的两个重写方法
(1)onTick(long l)方法会在你设置的每个倒计时单位时间进行调用,比如你设置的倒计时时长为60s,倒计时单位时间为1s,那么此方法就会被调用60次,从上面代码中大家也可以看到在这个方法中主要就是实现的对倒计时时间的显示。
(2)onFinish()方法调用时机就是当倒计时结束时进行调用,在此方法中可以设置一些倒计时结束的状态,文字等。
(3)还有一个比较重要的方法就是它的构造函数:第一个参数是计时总时长,单位是毫秒,第二个参数是倒计时的单位时间,TimeCount 类的初始化我们可以方法onCreate()方法中去执行,下面代码是60s倒计时。
mTime = new TimeCount(60000,1000);
启动倒计时,我们可以在按钮的点击方法中只需执行下面一行代码即可
mTime.start();
取消计时,在生命周期方法中执行以下代码
@Override
protected void onPause() {
super.onPause();
mTime.cancel();
}
当倒计时未结束,重新进入该页面时,倒计时继续执行
使用场景中很可能会出现这样的问题,当用户正在获取验证码页面请求验证码,倒计时开始,这时用户退出当前页面,又很快再次进入该页面,这时,如果时间还没有到结束时间,我们还是需要将按钮置为不可点击状态,并且时间继续倒计时。为了实现该功能,我们就需要去注意两个“时间”,第一个“时间”就是倒计时正常结束时的系统时间,第二个就是你再次进入该页面时的系统时间,为什么说是这两个时间,我们继续往下分析。
(1)倒计时正常结束时的系统时间:之所以要获取这个时间,就是想知道,当我再次进入此页面时,倒计时是否结束,当倒计时未结束时,我们才让它继续倒计时,在退出页面的时,在onPause()方法中将(当前时间+倒计时剩余时间)存储到sharepreference中,再次进入该页面时,首先判断之前存储的值是否为为默认值0,如果不为0,则表示不是第一次进入该页面,这时需要将用正常倒计时该结束的时间-系统当前时间,如果大于0,则表示倒计时还未结束,需要继续倒计时。否则表示倒计时结束,重新倒计时。
@Override
protected void onPause() {
super.onPause();
mLeaveTime = System.currentTimeMillis();
/**
*mLeaveTime :退出时,系统当前时间
*mCurrentRestTime:倒计时剩余时间
*/
CommonPreferences.putValue(this,VERIFICATION_REST_TIME,String.valueOf(mLeaveTime+mCurrentRestTime));
}
在onCreate()方法中
/*
* 倒计时应该结束的时间
*/
long endTime = Long.parseLong(CommonPreferences.getValue(this,VERIFICATION_REST_TIME));
/**
* !=0表示不是第一次进入该页面
*/
if(endTime!=0){
/**
* 倒计时剩余时间
*/
long currTime = System.currentTimeMillis();
long restTimerTime = endTime - currTime;
if (restTimerTime > 0){
time = new TimeCount(restTimerTime, 1000);
time.start();
}else {
time = new TimeCount(60000, 1000);
}
}else {
time = new TimeCount(60000, 1000);
}
这样,当倒计时未结束,重新进入该页面时,倒计时继续执行的功能就实现了,如果哪有讲的不是很明白或者大家不太明白的地方,希望大家留言指正和交流!