Android 计时器: CountDownTimer和JobService

简介: 1. CountDownTimer介绍: 定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。参数: millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。

1. CountDownTimer

介绍: 定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。
参数: millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。(倒计时时间,单位毫秒) countDownInterval 接收onTick(long)回调的间隔时间。(单位毫秒)
公共方法:

  • public final void cancel () 取消倒计时(取消后,再次启动会重新开始倒计时)
  • public abstract void onFinish () 倒计时完成时被调用
  • public abstract void onTick (long millisUntilFinished) 固定间隔被调用, 参数 millisUntilFinished 倒计时剩余时间。
  • public synchronized final CountDownTimer start () 启动倒计时
    CountDownTimer countDownTimer = new CountDownTimer(30000, 1000) {
      @Override public void onTick(long millisUntilFinished) {
        Log.e(TAG, "seconds remaining: " + millisUntilFinished / 1000);
      }

      @Override public void onFinish() {
        Log.e(TAG, "done!");
      }
    };

    countDownTimer.start();

2. JobService

1). 自定义类继承JobService
/**
 * Job服务
 */
class TestJobService : JobService() {
  
  @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
  override fun onStartJob(params: JobParameters?): Boolean {
    L.e("onStartJob: " + params.toString())
    // job结束 ,参数二:需要再一次schedule,设置为false则不再执行
    jobFinished(params, true)
    return true
  }
  
  override fun onStopJob(params: JobParameters?): Boolean {
    L.e("onStopJob: " + params.toString())
    return true
  }
  
}
2). 开启服务
    // 获取JobScheduler服务
    jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
//    val time = 15 * 60 * 1000
    val time = 15
    // 指定哪个JobService执行操作
    val builder = JobInfo.Builder(1, ComponentName(this, TestJobService::class.java))
    if (time >= 15 * 60 * 1000) {
      // 设置重复时间, 单位ms
      builder.setPeriodic(15 * 60 * 1000)
      // 设置持久化
      builder.setPersisted(true)
      // 设置网络类型
      builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    } else {
      // 执行最小延时时间
      builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10))
      // 执行最长延时时间
      builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(10))
      // 线性重试方案
      builder.setBackoffCriteria(TimeUnit.SECONDS.toMillis(10), JobInfo.BACKOFF_POLICY_LINEAR)
      // 未充电状态
      builder.setRequiresCharging(false)
    }
    // 执行任务
    jobScheduler!!.schedule(builder.build())

注:如果重复JobService服务的时长小于15分钟,则需要使用else语句块中的代码,否则会报如下警告

W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms
3). 结束
    jobScheduler?.cancel(1)
4). 完整代码
class JobActivity : AppCompatActivity() {
  private var jobScheduler: JobScheduler? = null
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_job)
  }
  
  /**
   * 开启Job服务
   */
  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  fun onStartService(view: View) {
    // 获取JobScheduler服务
    jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
//    val time = 15 * 60 * 1000
    val time = 15
    // 指定哪个JobService执行操作
    val builder = JobInfo.Builder(1, ComponentName(this, TestJobService::class.java))
    if (time >= 15 * 60 * 1000) {
      // 设置重复时间, 单位ms
      builder.setPeriodic(15 * 60 * 1000)
      // 设置持久化
      builder.setPersisted(true)
      // 设置网络类型
      builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    } else {
      // 执行最小延时时间
      builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10))
      // 执行最长延时时间
      builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(10))
      // 线性重试方案
      builder.setBackoffCriteria(TimeUnit.SECONDS.toMillis(10), JobInfo.BACKOFF_POLICY_LINEAR)
      // 未充电状态
      builder.setRequiresCharging(false)
    }
    // 执行任务
    jobScheduler!!.schedule(builder.build())
  }
  
  /**
   * 关闭Job服务
   */
  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  fun onStopService(view: View) {
    // 使用?时,应用程序不崩溃,并且点击按钮无反应
    jobScheduler?.cancel(1)
  }
}
目录
相关文章
|
6月前
|
XML Java Android开发
Android Studio App开发实战项目之计时器(附源码 简单易懂,适合新手学习)
vAndroid Studio App开发实战项目之计时器(附源码 简单易懂,适合新手学习)
355 0
|
XML Android开发 数据格式
Android 中简单计时器的实现方法(Handler和TimerTask)
Android 中简单计时器的实现方法(Handler和TimerTask)
485 0
|
XML 开发工具 Android开发
Android 计时器Chronometer 使用及源码分析
Chronometer 主要XML属性如下: 常用方法 示例 主界面布局文件 主界面代码 Format格式修改 源码分析 setBase() dispatchChronometerTick() updateText() start() stop() updateRunning() setFormat(String) setCountDown()
606 0
Android 计时器Chronometer 使用及源码分析
|
Android开发
利用Android自带的CountDownTimer实现手机验证码倒计时
利用Android中自带的CountDownTimer实现手机验证码倒计时 public class TimeCountUtil extends CountDownTimer { private static final int TIME_TA...
1142 0
|
Android开发 Java
Android用5种方式实现自定义计时器, 哪种才是你的菜?
Chronometer和CountDownTimer计时器github传送门 目录 效果图 前言 Timer + TimerTask + Handler Timer + TimerTask Handler Thread + Handler Handler + Runnable 最后 效果图 看下效果图, 这是五种不同的方式演示计时器.
1491 0
|
Android开发
《Android应用开发攻略》——1.14 程序:简单的CountDownTimer示例
本节书摘来自华章计算机《Android应用开发攻略》一书中的第1章,第1.14节,作者:(美)达尔文(Darwin, I. F.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1367 0
下一篇
无影云桌面