Service中进行倒计时

前言:本文是关于一个发送验证码倒计时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的时候拿出来赋值即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值