android之Jobscheduler定时任务调度问题

有时我们需要在特定情况下启动事务,比如说延迟若干时间之后,或在特定网络下运行或者等手机空闲了再运行。如果通过各种条件的Service,会注册各种事件势必增加程序逻辑的复杂度,工程代码也将变得不易维护。
Android从5.0开始,增加支持一种特殊的机制,即任务调度JobScheduler,任务调度机制由三个工具组成。
首先是JobInfo,它指定了一个任务的概要信息,比如何时启动,启动时需要满足什么条件等等;
其次是JobScheduler,它是系统提供的任务调度服务,它的实例从系统服务Context.JOB_SCHEDULER_SERVICE中获得;
最后是JobService,它描述了该任务内部的具体业务逻辑,它的运行时刻由JobScheduler根据JobInfo指定的条件而计算决定。

JobInfo 、JobScheduler和JobService

具体的可以自己查看API,参考其他资料,我是参考这篇文章,写的很清楚,但是后来我还翻了以下源码,建议最好还是自己阅读一下相关的源码。在各个版本上效果不同,坑就在这里。

  • Android 7.0上定时任务时间不对
    可以参考这篇文章
    在7.0调用setPeriodic()之后在获取间隔时间getIntervalMillis() 强制使用了最小时间15分钟。所以想通过setPeriodic()来设置小于15分钟间隔是不行的。所以如果小于15分钟需要通过设置setMinimumLatency ()。
    截图来自Android API 27源码
    android之Jobscheduler定时任务调度问题_第1张图片

    android之Jobscheduler定时任务调度问题_第2张图片

  • 至少10秒的默认间隔
    悲剧~~~~~
    设置 builder.setBackoffCriteria(1000L, JobInfo.BACKOFF_POLICY_LINEAR),间隔为1秒,但是打印的日志来看还是10秒的线性增长策略。


    android之Jobscheduler定时任务调度问题_第3张图片

    设置15秒间隔后,打印的日志:


    android之Jobscheduler定时任务调度问题_第4张图片

    15秒的线性增长策略。
    暂时就写到这里,还得研究一下源码~~~

你可能感兴趣的:(android之Jobscheduler定时任务调度问题)