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)
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,169评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,528评论 18 399
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,900评论 0 17
  • 平板支撑1分50秒,深蹲40个,交叉附身40个。后腰两侧的肌肉开始有酸疼的感觉,一直对这种酸疼很追逐很享受,没想到...
    尘世书童阅读 1,441评论 0 1
  • 中国里孩子满月是个大日子,家境比较好的会摆满月酒,而且到年例时候还会有“吊灯”的习俗。孩子的满月离不开另外一个话题...
    一加一阅读 1,837评论 0 2

友情链接更多精彩内容