主要思想是这样的:将倒计时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的倒计时源代码

用Service+Broadcast解决倒计时过程中Activity被销毁的问题的更多相关文章

  1. csharp编写界面,opencv编写类库,解决 Pinvoke过程中的参数传递和平台调用问题

        使用csharp 编写winform程序,不仅速度快,而且容易界面美化并找到其他类库的支持:而使用 opencv编写图形图像处理程序,是目前比较流行,而且高效的一种方法.如果需要将两者结合,需 ...

  2. java多线程的等待唤醒机制及如何解决同步过程中的安全问题

    /* class Person{ String name; String sex; boolean flag = true; public void setPerson(String name, St ...

  3. 用apt-get解决dpkg过程中出现的依赖问题

    dpkg命令不解决依赖问题,这点对新手很不友好 当使用dpkg -i *.deb 安装出现依赖问题的时候,可以尝试如下解决方法: apt-get -f -y install # 复制粘贴回车,inst ...

  4. Android深入理解Context(二)Activity和Service的Context创建过程

    前言 上一篇文章我们学习了Context关联类和Application Context的创建过程,这一篇我们接着来学习Activity和Service的Context创建过程.需要注意的是,本篇的知识 ...

  5. MySQL Fabric和MyBatis的整合过程中遇到的问题

    这是我昨天在整合MySQL Fabric和MyBatis时遇到的问题,花了大半天才解决的问题,解决的过程中在网上查找了很久,都没有找到解决的方案.现在记下来,希望能够帮助有同样问题的朋友.如果各位朋友 ...

  6. 为Secure Store Service生成新密钥,解决“生成密钥过程中发现错误”的问题

    我们集成TFS和SharePoint Server以后,一个最常见的需求是通过SharePoint Server的Excel Service读取TFS报表中的信息,利用Excel Service的强大 ...

  7. 经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能

    说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后, ...

  8. 学习Android过程中遇到的问题及解决方法——电话监听

    也许有时你会有这样一个需求:通电话时有一个重要的事需要记下来或者和一个陌生人特别是大骗子通话时,这是就想如果能把通话录下来就方便多了.(这才是我写这个代码的目的!!!) 在此过程中,犯了一个很大的错误 ...

  9. 用友ERP-U8最新破解(再次更新版本,附安装过程中的解决办法)

    新版用友u8.70下载地址:http://ftp.shangyuchem.com/应用软件/用友ERP-U8管理软件(8.70版).rar 准备好安装环境,因为需要SQLSERVER和IIS支持,而个 ...

随机推荐

  1. windows下编译安装BOOST

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  2. FFPLAY的原理(六)

    显示视频 这就是我们的视频线程.现在我们看过了几乎所有的线程除了一个--记得我们调用schedule_refresh()函数吗?让我们看一下实际中是如何做的: static void schedule ...

  3. javaWeb安全漏洞修复总结

    1 Web安全介绍1 2 SQL注入.盲注1 2.1 SQL注入.盲注概述 1 2.2 安全风险及原因 2 2.3 AppScan扫描建议 2 2.4 应用程序解决方案 4 3 会话标识未更新7 3. ...

  4. JSPWiki安装配置及FCKEditor的集成

    版本:JSPWiki-2.8.2 FCKeditor_2.6.3     安装方法我参照:http://doc.jspwiki.org/2.4/wiki/InstallingJSPWiki FCKEd ...

  5. Spring Security简明实践及相关国际化处理

    别人的都是最佳实践,因为我目前的设置没有按照参考文档推荐,还是采用DelegatingFilterProxy,所以我只能说简明实践.先贴我的applicationContext-security.xm ...

  6. vi 常用命令使用說明

    vi是一種文字模式全螢幕文字編輯軟體(Text Editor).對初學者來說,vi是個很難用的工具,一般需要2個星期的時間才能得心應手.之所以介紹vi,其理由如下: vi是Unix上的標準文字編輯軟體 ...

  7. 五年级--python函数高级运用

    一.装饰器 二.迭代器 三.生成器 四.练习 一.装饰器 1.1 闭包函数用法 # 需求: # 执行一个函数前需要认证是否登录,如果登录则不需再登录. # 只认证一次,后续操作无需认证 # 要求认证使 ...

  8. C# 使用SmtpClient发送Email

    使用Winfrom写的报错信息发送邮件通知. 以下主要代码 /// <summary> /// 发送邮件核心代码 /// </summary> /// <param na ...

  9. Spring+Redis的部署与Redis缓存使用示例

    由于项目的业务需要,这两天折腾了一下Spring-redis配置,有了前面用Spring托管hibernate的经验,这次可以说是顺风顺水,大概说一下流程. ubuntu 安装 redis sudo ...

  10. 基于ASP.NET MVC 微信网页登录授权(scope为snsapi_base) 流程 上 获取OPENID

    流程图 我们需要判断是否存在OPENID  首先我们得先定义一个全局的OPENID 类似于普通账号密码登录系统的 当前登录用户ID  因为我是MVC 框架  我这里定义一个控制器基类 BaseCont ...