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

来源:互联网 发布:淘宝流量统计工具叫啥 编辑:程序博客网 时间:2024/05/14 17:30
账号注册是一个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 "源码")
阅读全文
0 0
原创粉丝点击