Android 计时器: CountDownTimer和JobService

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)
  }
}

你可能感兴趣的:(Android 计时器: CountDownTimer和JobService)