由于要做暂停和恢复,这里我就没有使用Android的CountDownTimer,而是用了Java的Timer。所以,这个方法在java肯定是通用。我也外加了Android独有的Service,有些计时器需要在Activiy关闭的情况下依然在计时,回到Activity时,显示当前的计时状态。

Timer 这个Java的类,具体看Java的API说明,但是要注意一点:

Timer 在cancel后,需要重新new 一次。

首先要给计时器定义三个状态:准备,开始,暂停。

  1. public static final int PREPARE = 0;
  2. public static final int START = 1;
  3. public static final int PASUSE = 2;

1.准备:没有开始计时,最初始状态;

2.开始:已经开始倒计时

3.暂停:已经开始倒计时,而且用户点击了暂停

开始、恢复倒计时,我定义了这个方法:

  1. private void startTimer(){
  2. timer = new Timer();
  3. timerTask = new MyTimerTask();
  4. timer.scheduleAtFixedRate(timerTask, 0, timer_unit);
  5. }

timer_unit 就是执行timer 任务的时间,我定义为1秒。MyTimerTask是我定义的一个倒计时计算方法,如下:

  1. private class MyTimerTask extends TimerTask{
  2. @Override
  3. public void run() {
  4. timer_couting -=timer_unit;
  5. if(timer_couting==0){
  6. cancel();
  7. initTimerStatus();
  8. }
  9. mHandler.sendEmptyMessage(1);
  10. }
  11. }

timer_couting 是一个变量,记录当前倒计时还剩余多少时间,当剩余时间为0时,倒计时结束,所以cancel结束倒计时。每次倒计一秒通过handler发送到主线程来更新ui提示倒计时信息。

在界面上定义两个按钮,一个开始,一个停止,开始后可以暂停,暂停后可以恢复。

  1. case R.id.btn_start:
  2. switch (timerStatus){
  3. case CountDownTimerUtil.PREPARE:
  4. startTimer();
  5. timerStatus = CountDownTimerUtil.START;
  6. btnStart.setText("PAUSE");
  7. break;
  8. case CountDownTimerUtil.START:
  9. timer.cancel();
  10. timerStatus = CountDownTimerUtil.PASUSE;
  11. btnStart.setText("RESUME");
  12. break;
  13. case CountDownTimerUtil.PASUSE:
  14. startTimer();
  15. timerStatus = CountDownTimerUtil.START;
  16. btnStart.setText("PAUSE");
  17. break;
  18. }
  19. break;
  20. case R.id.btn_stop:
  21. if(timer!=null){
  22. timer.cancel();
  23. initTimerStatus();
  24. mHandler.sendEmptyMessage(1);
  25. }

对于Android应用中需要用到关闭了Activity后依然在计时,在这里我们需要用Service,定义Service的情况跟上面类同,但是要注意的是这个计时Service是要单例模式,保证每次倒计时进来都是同一个倒计时。还需要定义一些方法来让Activity给这个Service传递操作命令,开始,暂停,恢复,停止。

  1. public void startCountDown(){
  2. startTimer();
  3. timerStatus = CountDownTimerUtil.START;
  4. }
  5. public void pauseCountDown(){
  6. timer.cancel();
  7. timerStatus = CountDownTimerUtil.PASUSE;
  8. }
  9. public void stopCountDown(){
  10. if(timer!=null){
  11. timer.cancel();
  12. initTimerStatus();
  13. mCountDownTimerListener.onChange();
  14. }
  15. }

在Activity里面获取这个Service

  1. countDownTimerService = CountDownTimerService.getInstance(new MyCountDownLisener()
  2. ,service_distination_total);

项目源码:https://github.com/arjinmc/Android-CountDownTimer

 
看得不爽,点我技术博客:http://blog.csdn.net/arjinmc/article/details/47775995

Java/Android倒计时(开始,暂停,恢复,停止)的更多相关文章

  1. android倒计时(整理)

    android倒计时 用到CountDownTimer Android中文API(143) —— CountDownTimer 前言 本章内容android.os.CountDownTime章节,版本 ...

  2. 【转】android错误 aapt.exe已停止工作的解决方法

    http://www.jb51.net/article/57420.htm 在使用eclipse进行安卓java的编程的时候,有时候我们会遇到这样的问题:那就是无故弹出aapt.exe停止工作的提示, ...

  3. python-线程的暂停, 恢复, 退出

    我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦s ...

  4. cocos2d-x 暂停/恢复 与场景相关(SceneGraph类型)的监听器

    开发过程中,我们经常会遇到这样的情况:想要让一个Layer中所有的Node对象的事件都停止响应. 在响应用户事件后,又要恢复该Layer的所有事件响应. 如: 用户想要显示一个模式对话框,显示对话框后 ...

  5. CALayer动画的暂停,恢复,以及结束时候的回调

    CALayer动画的暂停,恢复,以及结束时候的回调 源码如下: // // ViewController.m // AnimationLineView // // Created by YouXian ...

  6. 关于 Java(TM) Platform SE binary 已停止工作 的解决方法

    一.问题描述 昨天晚上Myeclipse还用着好好的,今天早上打开工程,只要运行就卡住,大半天弹出个消息窗口:Java(TM) Platform SE binary 已停止工作. 如图 关闭Myecl ...

  7. Java/Android引用类型及其使用分析

    Java/Android中有四种引用类型,分别是: Strong reference     - 强引用Soft Reference        - 软引用Weak Reference      - ...

  8. Atitti.java android反编译解决方案-----虚拟机方案

    Atitti.java android反编译解决方案-----虚拟机方案 哈哈,终极解决方案是虚拟机...c++也可以反编译为汇编代码,但无需担心,因为读懂汇编太麻烦..只要不能拿到c++源码就可.. ...

  9. Java Android HTTP实现总结

    Java Android HTTP实现总结 Http(Hypertext Transfer Protocol)超文本传输协议,是一个基于请求/响应模式的无状态的协议,Http1.1版给出了持续连接的机 ...

随机推荐

  1. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  2. Navicat标识为灰

    Navicat Premium作为一种通用数据管理工具,非常受迎接.最近,又遇到一个小问题.即为了实现自增,需要设置主键标识,而在Navicat中发现其为灰色,不可用. 原因:Navicat不允许设置 ...

  3. jQuery页面滚动图片等元素动态加载实现

    一.关于滚动显屏加载 常常会有这样子的页面,内容很丰富,页面很长,图片较多.比如说光棍节很疯狂的淘宝商城页面. 或者是前段时间写血本买了个高档耳机的京东商城页面,或者是新浪微博之类. 这些页面图片数量 ...

  4. 【树莓派】【网摘】树莓派与XBMC及Kodi、LibreELEC插件(三)

    之前的相关文章参考: [树莓派]树莓派与XBMC及Kodi.LibreELEC插件(一) [树莓派]树莓派与XBMC及Kodi.LibreELEC插件(二) [树莓派]树莓派与XBMC及Kodi.Li ...

  5. 使用Phantomjs和ChromeDriver添加Cookies的方法

    一.查看代码 : namespace ToutiaoSpider { class Program { static void Main(string[] args) { var db = Db.Get ...

  6. python 大小端数据转换

    "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000".decode('hex')[::-1].enc ...

  7. Spring MVC 中急速集成 Shiro 实践

    相信有很多的程序员,不愿意进行用户管理这块代码实现. 原因之一,不同的JavaEE 系统,用户管理都会有个性化的实现,逻辑很繁琐. 而且是系统门面,以后背锅的几率非常大,可谓是低收益高风险. 最近在系 ...

  8. java byte数组与String互转

      java byte数组与String互转 CreationTime--2018年7月6日14点53分 Author:Marydon 1.String-->byte[] 方法:使用String ...

  9. Android 虚拟现实(virtual reality)入门指南

    入门指南 本文档介绍怎样使用实验性的 Cardboard SDK for Android 创建您自己的虚拟实境 (VR) 体验. Android 演示版应用:Treasure Hunt 本教程中的代码 ...

  10. 配置阿里云Docker镜像加速仓库

    1.首先要有个阿里云的账号 2.访问:https://cr.console.aliyun.com 3.登陆后可看到: 我的加速地址:https://g65zw8cl.mirror.aliyuncs.c ...