主要思想是这样的: 将倒计时 CountDownTimer 放在 Service 里面进行, 每过一秒就一条发广播, 在主 Activity 里注册广播, 收到广播后更新 UI.
一, 写一个类 CodeTimerService 继承自 Service, 重写 onStartCommand(...) 方法.
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- // 第一个参数是总时间, 第二个参数是间隔
- mCodeTimer = new CountDownTimer(60000, 1000) {
- @Override
- public void onTick(long millisUntilFinished) {
- // 广播剩余时间
- broadcastUpdate(IN_RUNNING, millisUntilFinished / 1000 + "");
- }
- @Override
- public void onFinish() {
- // 广播倒计时结束
- broadcastUpdate(END_RUNNING);
- // 停止服务
- stopSelf();
- }
- };
- // 开始倒计时
- mCodeTimer.start();
- return super.onStartCommand(intent, flags, startId);
- }
- // 发送广播
- private void broadcastUpdate(final String action) {
- final Intent intent = new Intent(action);
- sendBroadcast(intent);
- }
- // 发送带有数据的广播
- private void broadcastUpdate(final String action, String time) {
- final Intent intent = new Intent(action);
- intent.putExtra("time", time);
- sendBroadcast(intent);
- }
先了解一下 CountDownTimer 怎么用:
创建 CountDownTimer 实例时传入两个参数, 第一个参数是总时间, 第二个参数是间隔; 需要重写 onTick(long millisUntilFinished) 和 onFinish() 两个回调方法, 前者表示倒计时进行中, 后者表示倒计时结束, 在方法中写处理事件; 最后调用 start() 方法开始倒计时.
二, 在主 Activity 中注册广播, 接收广播, 更新 UI
- // 注册广播
- private static IntentFilter updateIntentFilter() {
- final IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(RegisterCodeTimerService.IN_RUNNING);
- intentFilter.addAction(RegisterCodeTimerService.END_RUNNING);
- return intentFilter;
- }
- // 广播接收者
- private final BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- switch (action) {
- case RegisterCodeTimerService.IN_RUNNING:
- if (btnCountdown.isEnabled())
- btnCountdown.setEnabled(false);
- // 正在倒计时
- btnCountdown.setText("倒计时中 (" + intent.getStringExtra("time") + ")");
- Log.e(TAG, "倒计时中 (" + intent.getStringExtra("time") + ")");
- break;
- case RegisterCodeTimerService.END_RUNNING:
- // 完成倒计时
- btnCountdown.setEnabled(true);
- btnCountdown.setText(R.string.countdown);
- break;
- }
- }
- };
- @Override
- protected void onResume() {
- super.onResume();
- // 注册广播
- registerReceiver(mUpdateReceiver, updateIntentFilter());
- }
- @Override
- protected void onPause() {
- super.onPause();
- // 移除注册
- unregisterReceiver(mUpdateReceiver);
- }
最后补上例子的源代码: 跨 Activity 的倒计时源代码 http://download.csdn.net/download/talentclass_ctt/9578501
来源: https://www.cnblogs.com/ganchuanpu/p/9092845.html