相关文章推荐
刚失恋的回锅肉  ·  Hikari ...·  1 年前    · 
善良的水煮鱼  ·  linux socket ...·  1 年前    · 
谦逊的登山鞋  ·  android - Google Sign ...·  1 年前    · 
  • 应用保活
  • 特定时间,特定条件(系统空闲,电池电量,磁盘空间 ……)下运行程序

JobScheduler 提供分发各种条件的任务(通过 JobInfo构建),这个任务由系统在满足你设置的条件下执行(执行是通过调用JobService)。系统在执行任务时会批量和尽可能的延迟执行,如不设置deadline 的话,这个任务可能在任何延后的时刻执行。任务执行时你的app持有wakelock锁,保证任务能执行下去不会休眠
note:
从API 30 (Build.VERSION_CODES.R)10.0+开始,JobScheduler 的schedule调用会导致app bug,并且这个无视
target SDK version;也就是API 30不能再使用JobScheduler

JobScheduler是在Android 5.0中才有的

//JobScheduler系统服务获取
JobScheduler jobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE );

JobInfo构建

ComponentName serviceName = new ComponentName("yourPackageName",
       "^.MyJobService");
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
       //.setMinimumLatency(3000)
       .setPeriodic(15 * 60 * 1000)
       .build();

JobInfo提供的方法参数解释

方法说明
public Builder(int jobId, @NonNull ComponentName jobService)Builder构建构造函数;jobId:区别不同JobInfo ;ComponentName :指定满足条件后执行的jobService包名和类名
以下是设置时间相关条件
setMinimumLatency(long minLatencyMillis)设置任务执行的最小延迟时间,也就是minLatencyMillis时间之后执行,可能无限之后,需要配合setOverrideDeadline使用;不能和periodic job一起使用,会在build()的时候抛出参数异常
setOverrideDeadline(long maxExecutionDelayMillis)设置任务执行的最大延迟时间,可以与setMinimumLatency配合使用,这样就是在一个时间区间内执行
setPeriodic(long intervalMillis, long flexMillis)设置任务在一个时间周期重复执行,并且有一个弹性时间;执行序列start–>[flex,period]–>[flex,period]…… ;参数要求:intervalMillis要>getMinPeriodMillis(),否则就使用系统默认的getMinPeriodMillis()=15 minutes;flexMillis 要大于A=max(getMinFlexMillis()=5 minutes ,intervalMillis * 5%) ,否则就使用A
setPeriodic(long intervalMillis)直接调用setPeriodic(intervalMillis, intervalMillis)
以下是设置机器状态的相关条件
setRequiredNetworkType(@NetworkType int networkType)设置需要的网络状况
setRequiresCharging(boolean requiresCharging)设置是否需要设备插电中,默认false
setRequiresBatteryNotLow(boolean batteryNotLow)设置是否在电池非低状态
setRequiresDeviceIdle(boolean requiresDeviceIdle)设置是否在设备空闲状态
setRequiresStorageNotLow(boolean storageNotLow)设置是否在磁盘非低状态
设置完条件后,需要执行得到JobInfo 对象
public JobInfo build()构建出JobInfo 对象,采用了Builder设计模式

JobService 定义

public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        return true;
    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
 

需要在AndroidManifest.xml中注册

 <service
     android:name="…….MyJobService "
     android:permission="android.permission.BIND_JOB_SERVICE" />

JobScheduler通过JobInfo调用JobService

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
            JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(context.getPackageName(), MyJobService.class.getName()));
             * 5分钟后执行,可能一直延后
             * 这个设置不能和周期性任务一起设置
            builder.setMinimumLatency(5 * 60 * 1000);
             * 截止到20分钟之前执行;设置了这个Deadline,requirements相关条件不满足也会执行
             * 这个设置不能和周期性任务一起设置
            builder.setOverrideDeadline(20 * 60 * 1000);
             * 设置需要的网络条件
             * 如果设置了这个requirements又设置了setOverrideDeadline可以通过
             * JobService中的onStartJob(JobParameters params)中的isOverrideDeadlineExpired()判断是不是由Deadline触发
            builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
            JobInfo jobInfo = builder.build();
            scheduler.schedule(jobInfo);

版本对JobScheduler 的影响

谷歌开发文档:

Note: Beginning with API 30 (Build.VERSION_CODES.R), JobScheduler will throttle runaway applications. Calling schedule(android.app.job.JobInfo) and other such methods with very high frequency is indicative of an app bug and so, to make sure the system doesn’t get overwhelmed, JobScheduler will begin to throttle apps that show buggy behavior, regardless of target SDK version.

API 30开始JobScheduler 将会报错,哪怕你把target SDK 调低也没用

此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!

从上面的配置可用看出,org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpression属性。 一个cronExpression表达式有至少6个(也可能是7个)由空格分隔的时间元素。例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔1分钟执行一次:0 */1 * * * ? 例3:每天凌晨1点执行一次:0 0 1 * * ? 例4:每月1号凌晨1点执行一次:0 0 1 1 * ?
总所周知,Service是四大组件之一,它没有用户操作界面,运行于系统之中不易被用户发现,它不是一个单独的进程也不是一个线程,那我们可以用其来做些什么呢。 1. 应用内或者应用间的数据通信 2. 执行时间运行的操作,例如开发监控之类的东西 这两点就是服务的用途。 一. 生命周期 二 . 服务的启动方式 既然是四大组件,那我们就需要在清单文件中注册它,接下来就是如何使用,服务的启动...
JobScheduler是用于计划基于应用进程的多种类型任务的api接口。 对象获取方法:[Context.getSystemService(Context.JOB_SCHEDULER_SERVICE)] 使用JobInfo.Builder.JobI... APScheduler是一个 Python 定时任务框架,提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务、并以 daemon 方式运行应用。 BlockingScheduler 是 APScheduler 中的调度器,APScheduler 中有两种常用的调度器, BlockingScheduler 和 Back 官方Demo - https://github.com/googlearchive/android-JobScheduler 个人Demo - https://github.com/aJanefish/JobSchedulerDemo Jobscheduler的android在5.0上针对于降低功耗而提出来的一种策略方案,自 Android 5.0 发布以来,JobSch
1、JobScheduler的使用 1.1 简介 JobScheduler主要用于在未来某个时间下满足一定条件时触发执行某项任务的情况,涉及的条件可以是网络、电量、时间等,例如执行特定的网络、是否只在充电时执行任务等。 1.2 相关API 1.2.1 JobScheduler JobScheduler类负责将应用需要执行任务发送给框架,以备对该应用Job的调度,是一个系统服务,可以通过如下方式获取: JobScheduler mJobScheduler = (JobScheduler) Context.g
Https证书验证相关;security.cert.CertPathValidatorException: Trust anchor for certification path not found. 16160 No version of NDK matched the requested version 21.0.6113669. Versions available locally: 21.3.65281 11581