账号注册是一个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 "源码")
注册验证码倒计时(含源码)
最新推荐文章于 2022-11-05 15:02:43 发布