Android JobScheduler每15分钟执行一次

Android JobScheduler每15分钟执行一次,android,job-scheduling,Android,Job Scheduling,我正在应用程序中使用JobScheduler。如果用户连接到WIFI,我想在每小时后上传文件,但onStartJob()方法在小时前被调用,大部分在15-20分钟后被调用。下面是我的代码: ComponentName componentName = new ComponentName(this,UploadService.class); JobInfo info = new JobInfo.Builder(1,componentName) .setRequired

我正在应用程序中使用JobScheduler。如果用户连接到WIFI,我想在每小时后上传文件,但
onStartJob()
方法在小时前被调用,大部分在15-20分钟后被调用。下面是我的代码:

ComponentName componentName = new ComponentName(this,UploadService.class);
    JobInfo info = new JobInfo.Builder(1,componentName)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // change this later to wifi
            .setPersisted(true)
            .setPeriodic(60*60*10000)
            .build();

    JobScheduler scheduler = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);
    int resultCode = scheduler.schedule(info);
    if (resultCode==JobScheduler.RESULT_SUCCESS) {
        Log.d(TAG,"JOb Scheduled");
    } else {
        Log.d(TAG,"Job Scheduling fail");
    }

public class UploadService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
    uploadFileToServer(params);
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    return true;
}
.....
.....
}

这里
上传文件到服务器(params)在小时前被调用。如何设置时间,使其仅在小时后调用。提前感谢来自JobInfo.java类的,
您无法控制何时在此间隔内执行此作业

    /**
     * Specify that this job should recur with the provided interval, not more than once per
     * period. You have no control over when within this interval this job will be executed,
     * only the guarantee that it will be executed at most once within this interval.
     * Setting this function on the builder with {@link #setMinimumLatency(long)} or
     * {@link #setOverrideDeadline(long)} will result in an error.
     * @param intervalMillis Millisecond interval for which this job will repeat.
     */
    public Builder setPeriodic(long intervalMillis) {
        return setPeriodic(intervalMillis, intervalMillis);
    }

JobInfo.Builder
上使用此方法
setPeriodic(长间隔毫秒,长flexMillis)
添加在API 24)并提供一个灵活间隔作为第二个参数:

long flexMillis = 59 * 60 * 1000; // wait 59 minutes before executing next job    

JobInfo info = new JobInfo.Builder(1,componentName)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // change this later to wifi
        .setPersisted(true)
        .setPeriodic(60 * 60 * 1000, flexMillis)
        .build();
重要-作业保证在弹性间隔后运行(在最后一个作业完成后开始),但不能保证在该时间后立即运行,因此作业之间的持续时间可以超过1小时,具体取决于作业要求、系统状态等

文件编号:

指定此作业应以提供的间隔和弹性重复。作业可以在周期结束时在灵活长度的窗口中随时执行



正如一些评论中已经建议的那样,您应该开始使用新的(即使它还不是生产级别),它具有与
作业调度器类似的功能,但它的最低SDK支持是14,这将允许您删除许多样板代码:)

由于作业调度器的问题,我已切换到工作管理器,作业调度器也需要安卓21。查看适用于所有版本的Work Manager。您的
作业完成后是什么样子的?谢谢您的解释,过一段时间我会测试并告知您。它添加到API级别24中,我必须支持API级别21您是对的,但这是
作业调度器的唯一选项。。您可以使用
WorkManager
实现这种行为,下面是一个示例:我正在为此使用WorkManager。