注册验证码倒计时(含源码)

账号注册是一个APP的首要任务,账号注册一般都要用到短信验证,而短信验证一般都需要一个60S倒计时,下面为大家分享一个倒计时服务!
首先自定义一个CountDownTimer,控制时长;
直接上代码:
public class RegisterCodeTimer extends CountDownTimer {

    private static Handler mHandler;
    public static final int IN_RUNNING = 1001;
    public static int END_RUNNING = 1002;
    public long mMillisUntilFinished = 0;

    /**
     * @param millisInFuture    // 倒计时的时长
     * @param countDownInterval // 间隔时间
     * @param handler           // 通知进度的Handler
     */
    public RegisterCodeTimer(long millisInFuture, long countDownInterval,
                             Handler handler) {
        super(millisInFuture, countDownInterval);
        mMillisUntilFinished = millisInFuture;
        mHandler = handler;
    }

    // 结束
    @Override
    public void onFinish() {
        mMillisUntilFinished = -1;
        // TODO Auto-generated method stub
        if (mHandler != null)
            mHandler.obtainMessage(END_RUNNING, "重新发送").sendToTarget();
    }

    @Override
    public void onTick(long millisUntilFinished) {
        // TODO Auto-generated method stub
        mMillisUntilFinished = millisUntilFinished;
        if (mHandler != null)
            mHandler.obtainMessage(IN_RUNNING,
                    (millisUntilFinished / 1000) + "s 后重新发送").sendToTarget();
    }

}
接下来倒计时即便界面关闭了,倒计时依然要进行,所以需要通过Service来实现,自定义RegisterCodeTimerService,继承Service;
代码如下:
public class RegisterCodeTimerService extends Service {

    private static int DEFAULT_TIME = 30000;
    private static Intent mIntent;

    private static Handler mHandler;
    private static RegisterCodeTimer mCodeTimer;

    private static View mSendCodeView;

    /**
     * 获取用来倒计时的具体实例
     * 就是一个线程
     *
     * @return
     */
    public static RegisterCodeTimer getRegisterCodeTimer() {
        return mCodeTimer;
    }

    public static void startService(Activity activity, int beginBackgroundRes) {
        getIntent(activity);
        mSendCodeView.setEnabled(false);
        mSendCodeView.setBackgroundResource(beginBackgroundRes);
        activity.startService(mIntent);
    }

    /**
     * 获取这个服务中的Intent
     *
     * @param context
     * @return
     */
    private static Intent getIntent(Context context) {
        if (mIntent == null) {
            mIntent = new Intent(context, RegisterCodeTimerService.class);
        }
        return mIntent;
    }

    /**
     * 设置停止倒计时
     */
    public static void onActivityFinish() {
        if (mCodeTimer != null) {
            mCodeTimer.cancel();
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub

        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        mCodeTimer = new RegisterCodeTimer(DEFAULT_TIME, 1000, mHandler);
        mCodeTimer.start();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        mCodeTimer.onFinish();
        super.onDestroy();
    }


    /**
     * 设置要进行倒计时的控件
     *
     * @param view                 具体倒计时的控件
     * @param endTimeBackgroundRes 结束倒计时后的背景资源
     */
    public static void setCountDownView(View view, final int endTimeBackgroundRes) {

        if (view instanceof TextView) {

            final TextView textView = (TextView) view;
            mSendCodeView = textView;
            /**
             * 倒计时Handler
             */
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    if (msg.what == RegisterCodeTimer.IN_RUNNING) {// 正在倒计时
                        textView.setText(msg.obj.toString());
                        textView.setBackgroundResource(R.drawable.bg_blue_fillet);
                    } else if (msg.what == RegisterCodeTimer.END_RUNNING) {// 完成倒计时
                        textView.setEnabled(true);
                        textView.setText(msg.obj.toString());
                        textView.setBackgroundResource(endTimeBackgroundRes);
                    }
                }
            };
        }

    }

    /**
     * 设置要倒计时的时间
     *
     * @param time
     */
    public static void setCountDownTime(int time) {
        DEFAULT_TIME = time;
    }

}

然后就是使用了:
第一步:去清单文件注册Service;
<!-- 倒计时的Service -->
 <service
        android:name=".service.RegisterCodeTimerService"
        android:enabled="true" />
   第二步:设置要倒计时的控件,控件的背景色,倒计时时长;
   RegisterCodeTimerService.setCountDownTime(60000);
        RegisterCodeTimerService.setCountDownView(mDataBinding.registerBtnCode, R.drawable.bg_blue_fillet);
  第三步:在需要开启倒计时的地方,调用RegisterCodeTimerService中的startService方法,并设置倒计时开始控件的背景色;
  RegisterCodeTimerService.startService(RegisterActivity.this, R.drawable.bg_blue_fillet);
  第四步:当页面消失的时候需要调用onActivityFinish();
    @Override
    protected void onDestroy() {
        super.onDestroy();
        RegisterCodeTimerService.onActivityFinish();
    }
    PS:一定不能忘了注册Service哦;
    [源码下载地址](https://github.com/lvqingfeng/Lightning/blob/master/app/src/main/java/com/lightningfast/service/RegisterCodeTimerService.java "源码")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值