Android倒计时原理的实现

时间:2021-08-21 23:25:08
Android倒计时原理的实现
  1. 需求:对于密码框,用户多次错误输入后,需要禁止用户输入,并且提示倒计时,类似于android手机多次错误输入锁屏密码;
  2. 方案1:使用handler倒计时,提示用户剩余时间;每隔1s,更新提示时间,对于这种如果程序退出密码框又可以重新输入,用户体验不好;
  3. 方案2:参考android锁屏原生代码,发现其主要使用到了CountDownTimer;CountDownTimer的构造方法有两个参数,参数1表示倒计时的总时间,参数2每次倒计时的跨度,我们一般可以设置为1000,代表每次间隔1s;其主要用法如以下实例:
    • new CountDownTimer(elapsedRealtimeDeadline - SystemClock.elapsedRealtime(), 1000) {
          @Override
          public void onTick(long millisUntilFinished) {
              //此处给用户提示
              mTextView.setText(getString(R.string.passwd_input_error_wait, millisUntilFinished / 1000));
          }
      
          @Override
          public void onFinish() {
              //此处设置键盘可以点击
              mNumberPad.setNumberPadClickable(true);
              mTextView.setText(getString(R.string.input_pwd));
              Settings.System.putLong(getContentResolver(), "com_bird_goodx_over_time_pass", 0L);
              numberFailCount = 0;
          }
      }.start();
      • 其中onTick方法,每次计时的时候回调的方法;onFinish是计时时间全部结束时回调的方法;另:实例中用到了SystemClock类,该类主要有两个静态方法:
      native public static long uptimeMillis();
      
      native public static long elapsedRealtime();
      • 其中uptimeMillis方法获取到的时间是:系统启动到现在处于的非休眠的时间;elapsedRrealtime方法获取的是:系统启动到现在的时间;两者的不同在于前者获取的时间不包括休眠时间;

  4. 看android锁屏发现,灭屏后再亮屏倒计时还在, 是因为在view再次显示的时候重新启动倒计时,为了确保倒计时的起始值是OK的,我们需要将倒计时的结束时间点保存到数据库中(当然SharePreference中也可以),每次启用倒计时的时候,重新获取下该值就可以了;另外记得结束的时候重置数据库。