前言:本文是关于一个发送验证码倒计时60s,退出验证码填写界面后,60s倒计时结束之前,再次进入倒计时页面,倒计时不会重新开始。鉴于这个功能可能比较常见,需要的可以直接粘过去。
下来介绍我的实现过程:开启一个service进行倒计时,把时间通过广播发送到活动中进行相应操作,就这么点。
一、创建一个service,里面进行倒计时,并实时发送广播:
public class CountDownService extends Service {
CountDownTimer mCountDownTimer;
@Override
public void onCreate() {
super.onCreate();
mCountDownTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
Intent intent = new Intent(COUNTDOWN_INNER);
intent.putExtra(COUNTDOWN_TIME, (int) millisUntilFinished / 1000);
sendBroadcast(intent);
countDown = (int) millisUntilFinished / 1000;
}
@Override
public void onFinish() {
Intent intent = new Intent(COUNTDOWN_END);
sendBroadcast(intent);
stopSelf();
}
};
mCountDownTimer.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
mCountDownTimer = null;
}
super.onDestroy();
}
}
二、在当前Activity创建一个广播接收者,接收service中发送过来的实时时间,在manifest中注册:
public class CountDownReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (COUNTDOWN_INNER.equals(action)) {//倒计时中
codeTimerTxt.setText(intent.getIntExtra(COUNTDOWN_TIME, -1) + "s 后重发");
} else if (COUNTDOWN_END.equals(action)) {//倒计时结束
codeTimerTxt.setText(R.string.reset_verify_code);
}
}
}
注册/取消注册广播:
CountDownReceiver mReceiver = new CountDownReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(COUNTDOWN_INNER);
intentFilter.addAction(COUNTDOWN_END);
registerReceiver(mReceiver, intentFilter);
在onDestroy中:
if (mReceiver != null) {
unregisterReceiver(mReceiver);
}
最后,发送验证码的时候调用下面的代码,开启服务,服务一创建就会开始倒计时,每隔一秒发送一条时间广播
Intent intent = new Intent(TestActivity.this, CountDownService.class);
startService(intent);
补充一点:开始没写这个,因为后续有人问这个问题。每次进界面的时候,会有小于1s的间隔,可能会显示默认的文字之类的问题,我的解决办法是在Application加一个全局的静态变量:public static int countDown = 0;为了直观展示,这里在倒计时的时候做赋值操作countDown = (int) millisUntilFinished / 1000;该赋值操作个人认为最好是在Activity执行onStop的时候做,然后onResum的时候拿出来赋值即可。