摘要:本文将带你了解Android应用开发之用Service+Broadcast解决倒计时过程中Activity被销毁的问题,希望本文对大家学Android有所帮助。
主要思想是这样的:将倒计时CountDownTimer放在Service里面进行,每过一秒就一条发广播,在主Activity里注册广播,收到广播后更新UI。
一、写一个类CodeTimerService继承自Service,重写onStartCommand(...)方法。
1 @Override
2 public int onStartCommand(Intent intent, int flags, int startId) {
3
4 // 第一个参数是总时间, 第二个参数是间隔
5 mCodeTimer = new CountDownTimer(60000, 1000) {
6 @Override
7 public void onTick(long millisUntilFinished) {
8 // 广播剩余时间
9 broadcastUpdate(IN_RUNNING, millisUntilFinished / 1000 + "");
10 }
11
12 @Override
13 public void onFinish() {
14 // 广播倒计时结束
15 broadcastUpdate(END_RUNNING);
16 // 停止服务
17 stopSelf();
18 }
19 };
20 // 开始倒计时
21 mCodeTimer.start();
22 return super.onStartCommand(intent, flags, startId);
23 }
24
25 // 发送广播
26 private void broadcastUpdate(final String action) {
27 final Intent intent = new Intent(action);
28 sendBroadcast(intent);
29 }
30
31 // 发送带有数据的广播
32 private void broadcastUpdate(final String action, String time) {
33 final Intent intent = new Intent(action);
34 intent.putExtra("time", time);
35 sendBroadcast(intent);
36 }
先了解一下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的倒计时源代码
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号