主要思想是这样的:将倒计时CountDownTimer放在Service里面进行,每过一秒就一条发广播,在主Activity里注册广播,收到广播后更新UI。
一、写一个类CodeTimerService继承自Service,重写onStartCommand(...)方法。
@Override
public int onStartCommand(Intent intent, int flags, int startId) { // 第一个参数是总时间, 第二个参数是间隔
mCodeTimer = new CountDownTimer(, ) {
@Override
public void onTick(long millisUntilFinished) {
// 广播剩余时间
broadcastUpdate(IN_RUNNING, millisUntilFinished / + "");
} @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的倒计时源代码