Builder builder = new Builder(this); if (mId == CREATE_ID) { builder.mId = JobManager.instance().getJobStorage().nextJobId();
extras.putLong(EXTRA_END_MS, endMs); builder.addExtras(extras); .setExecutionWindow(Math.max(1L, startDelay), Math.max(1L, endDelay)) .build();
private void runJobAndCancelAllDuringExecution(boolean flex, boolean swapCancelOrder) { try { final int jobId = new JobRequest.Builder("any") .setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(flex ? 5 : 15)) .build() .schedule();
Builder builder = new Builder(this); if (mId == CREATE_ID) { builder.mId = JobManager.instance().getJobStorage().nextJobId();
extras.putLong(EXTRA_END_MS, endMs); builder.addExtras(extras); .setExecutionWindow(Math.max(1L, startDelay), Math.max(1L, endDelay)) .build();
return setExecutionWindow(exactInMs, exactInMs);
new JobRequest.Builder(CleanupJob.TAG) .setPeriodic(86400000) .build() .schedule();
.build() .schedule(); } catch (Exception e) {
/** * Cancel this request if it has been scheduled. Note that if the job isn't periodic, then the * time passed since the job has been scheduled is subtracted from the time frame. For example * a job should run between 4 and 6 seconds from now. You cancel the scheduled job after 2 * seconds, then the job will run between 2 and 4 seconds after it's been scheduled again. * * @return A builder to modify the parameters. */ public Builder cancelAndEdit() { // create a temporary variable, because .cancel() will reset mScheduledAt long scheduledAt = mScheduledAt; JobManager.instance().cancel(getJobId()); Builder builder = new Builder(this.mBuilder); mStarted = false; if (!isPeriodic()) { long offset = JobConfig.getClock().currentTimeMillis() - scheduledAt; long minValue = 1L; // 1ms builder.setExecutionWindow(Math.max(minValue, getStartMs() - offset), Math.max(minValue, getEndMs() - offset)); } return builder; }
/** * Schedules the daily job only once and runs it immediately. This is helpful if you want to reuse your job * and want to trigger the execution immediately. It's possible to schedule a daily job normally with * {@link #schedule(JobRequest.Builder, long, long)} and this method at the same time to trigger the * execution immediately. * * @param baseBuilder The builder of your daily job. * @return The unique ID for this job. */ public static int startNowOnce(@NonNull JobRequest.Builder baseBuilder) { PersistableBundleCompat extras = new PersistableBundleCompat(); extras.putBoolean(EXTRA_ONCE, true); return baseBuilder .startNow() .addExtras(extras) .build() .schedule(); }
/** * {@inheritDoc} */ @Override public void executeRequestsNow(int howMany) { int started = 0; for (JobRequest jobRequest : JobManager.instance().getAllJobRequests()) { if (isSoonButNotImmediate(jobRequest)) { JobRequest.Builder builder = jobRequest.cancelAndEdit(); long endMillis = Math.max(jobRequest.getEndMs(), RUN_NOW_TIME_WINDOW_END); builder.setExecutionWindow(RUN_NOW_TIME_WINDOW_START, endMillis).build().schedule(); started++; } if (started == howMany) { break; } } Logger.d(TAG, String.format("Job scheduled started %d requests.", started)); }
/** * Specify that this job should recur with the provided interval, not more than once per period. As * default a job isn't periodic. * * <br> * <br> * * It isn't allowed to specify a time window for a periodic job. Instead you set an interval * with this function. Since {@link Job.Result#RESCHEDULE} is ignored for periodic jobs, * setting a back-off criteria is illegal as well. * * @param intervalMs The job should run at most once every {@code intervalMs}. The minimum value is {@code 15min}. */ public Builder setPeriodic(long intervalMs) { return setPeriodic(intervalMs, intervalMs); }
/*package*/ Builder createBuilder() { return new Builder(mBuilder, true); }
/*package*/ JobRequest reschedule(boolean failure, boolean newJob) { JobRequest newRequest = new Builder(this.mBuilder, newJob).build(); if (failure) { newRequest.mFailureCount = mFailureCount + 1; } try { newRequest.schedule(); } catch (Exception e) { CAT.e(e); // this may crash (e.g. more than 100 jobs with JobScheduler), but it's not catchable for the user, wait for reschedule } return newRequest; }
public static void schedule() { if (JoH.pratelimit("daily-job-schedule", 60000)) { UserError.Log.uel(TAG, JoH.dateTimeText(JoH.tsl()) + " Job Scheduled"); // Debug only new JobRequest.Builder(TAG) .setPeriodic(Constants.DAY_IN_MS, Constants.HOUR_IN_MS * 12) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .setRequiredNetworkType(JobRequest.NetworkType.UNMETERED) .setUpdateCurrent(true) .build() .schedule(); } } }
public static void schedule() { if (JoH.pratelimit("daily-job-schedule", 60000)) { UserError.Log.uel(TAG, JoH.dateTimeText(JoH.tsl()) + " Job Scheduled"); // Debug only new JobRequest.Builder(TAG) .setPeriodic(Constants.DAY_IN_MS, Constants.HOUR_IN_MS * 12) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .setRequiredNetworkType(JobRequest.NetworkType.UNMETERED) .setUpdateCurrent(true) .build() .schedule(); } } }
static JobRequest adapt(UploadRequest request) { PersistableBundleCompat extras = new PersistableBundleCompat(); request.populateParamsFromFields(new AndroidJobRequestParams(extras)); UploadPolicy policy = request.getUploadPolicy(); JobRequest.Builder builder = new JobRequest.Builder(JOB_TAG) .setBackoffCriteria(policy.getBackoffMillis(), adaptPolicy(policy.getBackoffPolicy())) .setExtras(extras) .setExecutionWindow(request.getTimeWindow().getMinLatencyOffsetMillis(), request.getTimeWindow().getMaxExecutionDelayMillis()) .setRequiredNetworkType(adaptNetworkType(policy.getNetworkType())) .setRequiresCharging(policy.isRequiresCharging()) .setRequiresDeviceIdle(policy.isRequiresIdle()) .setRequirementsEnforced(true); return builder.build(); }
/*package*/ static JobRequest fromCursor(Cursor cursor) { JobRequest request = new Builder(cursor).build(); request.mFailureCount = cursor.getInt(cursor.getColumnIndex(JobStorage.COLUMN_NUM_FAILURES)); request.mScheduledAt = cursor.getLong(cursor.getColumnIndex(JobStorage.COLUMN_SCHEDULED_AT)); request.mStarted = cursor.getInt(cursor.getColumnIndex(JobStorage.COLUMN_STARTED)) > 0; request.mFlexSupport = cursor.getInt(cursor.getColumnIndex(JobStorage.COLUMN_FLEX_SUPPORT)) > 0; request.mLastRun = cursor.getLong(cursor.getColumnIndex(JobStorage.COLUMN_LAST_RUN)); JobPreconditions.checkArgumentNonnegative(request.mFailureCount, "failure count can't be negative"); JobPreconditions.checkArgumentNonnegative(request.mScheduledAt, "scheduled at can't be negative"); return request; }
public static void scheduleJob() { new JobRequest.Builder(HookFetchJob.TAG) .setPeriodic(TimeUnit.DAYS.toMillis(1)) .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) .build() .schedule(); } }
return setExecutionWindow(exactInMs, exactInMs);