有时我们需要在特定情况下启动事务,比如说延迟若干时间之后,或在特定网络下运行或者等手机空闲了再运行。如果通过各种条件的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源码
-
至少10秒的默认间隔
悲剧~~~~~
设置 builder.setBackoffCriteria(1000L, JobInfo.BACKOFF_POLICY_LINEAR),间隔为1秒,但是打印的日志来看还是10秒的线性增长策略。
设置15秒间隔后,打印的日志:
15秒的线性增长策略。
暂时就写到这里,还得研究一下源码~~~