public static void scheduleJob(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return; } try { JobScheduler jobScheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE); if (jobScheduler == null) { return; } JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(context, DaemonJobService.class)) .setRequiresCharging(false) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPeriodic(TimeUnit.MINUTES.toMillis(15)) .build(); jobScheduler.schedule(jobInfo); } catch (Exception ex) { ex.printStackTrace(); } } }
private void scheduleUpdate(int appWidgetId) { String frequency = getConfig(appWidgetId, R.string.pref_widget_frequency); long frequencyHourMillis = DateUtils.HOUR_IN_MILLIS * (TextUtils.isEmpty(frequency) ? DEFAULT_FREQUENCY_HOUR : Integer.valueOf(frequency)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getJobScheduler().schedule(new JobInfo.Builder(appWidgetId, new ComponentName(mContext.getPackageName(), WidgetRefreshJobService.class.getName())) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPeriodic(frequencyHourMillis) .build()); } else { mAlarmManager.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis() + frequencyHourMillis, frequencyHourMillis, createRefreshPendingIntent(appWidgetId)); } }
@Override @SuppressLint("MissingPermission") public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { getSupportFragmentManager().beginTransaction() .add(android.R.id.content, new EventLogFragment()).commit(); JobScheduler jobs= (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE); ComponentName cn=new ComponentName(this, ScheduledService.class); JobInfo.Builder b=new JobInfo.Builder(JOB_ID, cn) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE) .setPeriodic(60000) .setPersisted(false) .setRequiresCharging(false) .setRequiresDeviceIdle(false); jobs.schedule(b.build()); } } }
periodicJobBuilder.setPeriodic(scanState.getScanJobIntervalMillis(), 0L).build(); periodicJobBuilder.setPeriodic(scanState.getScanJobIntervalMillis()).build();
@RequiresApi(21) private void scheduleRegularTests(Context context) { initializeWithContext(context); ComponentName serviceComponent = new ComponentName(context, BluetoothTestJob.class); android.app.job.JobInfo.Builder builder = new android.app.job.JobInfo.Builder(BluetoothTestJob.getJobId(context), serviceComponent); builder.setRequiresCharging(false); builder.setRequiresDeviceIdle(false); builder.setPeriodic(900000L); // 900 secs is 15 minutes -- the minimum time on Android builder.setPersisted(true); PersistableBundle bundle = new PersistableBundle(); bundle.putInt("test_type", this.mTestType); builder.setExtras(bundle); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (jobScheduler != null) { jobScheduler.schedule(builder.build()); } }
@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) private void manageJobScheduler(boolean start) { JobScheduler jobs= (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE); if (start) { JobInfo.Builder b=new JobInfo.Builder(JOB_ID, new ComponentName(this, DemoJobService.class)); PersistableBundle pb=new PersistableBundle(); if (download.isChecked()) { pb.putBoolean(KEY_DOWNLOAD, true); b.setExtras(pb).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); } else { b.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE); } b.setPeriodic(getPeriod()).setPersisted(false) .setRequiresCharging(false).setRequiresDeviceIdle(true); jobs.schedule(b.build()); } else { jobs.cancel(JOB_ID); } }
private void manageJobScheduler(boolean start) { if (start) { JobInfo.Builder b=new JobInfo.Builder(JOB_ID, new ComponentName(this, DemoJobService.class)); PersistableBundle pb=new PersistableBundle(); if (download.isChecked()) { pb.putBoolean(KEY_DOWNLOAD, true); b.setExtras(pb).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); } else { b.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE); } b.setPeriodic(getPeriod()).setPersisted(false) .setRequiresCharging(false).setRequiresDeviceIdle(true); jobs.schedule(b.build()); } else { jobs.cancel(JOB_ID); } }
protected JobInfo.Builder createBuilderPeriodic(JobInfo.Builder builder, long intervalMs, long flexMs) { return builder.setPeriodic(intervalMs); }
@Override protected JobInfo.Builder createBuilderPeriodic(JobInfo.Builder builder, long intervalMs, long flexMs) { return builder.setPeriodic(intervalMs, flexMs); }
@TargetApi(Build.VERSION_CODES.O) static void scheduleJobs(Context ctxt) { SAWDetector.seeSAW(ctxt); ComponentName cn=new ComponentName(ctxt, PollingService.class); JobInfo.Builder b=new JobInfo.Builder(JOB_ID, cn) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE) .setPeriodic(15 * 60 * 1000, 60000) .setPersisted(true) .setRequiresCharging(false) .setRequiresDeviceIdle(false); ctxt.getSystemService(JobScheduler.class).schedule(b.build()); }
@Test public void cancelAll() { jobScheduler.schedule( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build()); jobScheduler.schedule( new JobInfo.Builder(33, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build()); assertThat(jobScheduler.getAllPendingJobs()).hasSize(2); jobScheduler.cancelAll(); assertThat(jobScheduler.getAllPendingJobs()).isEmpty(); }
@Test @Config(minSdk = N) public void getPendingJob_withInvalidId() { int jobId = 99; int invalidJobId = 100; JobInfo originalJobInfo = new JobInfo.Builder(jobId, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build(); jobScheduler.schedule(originalJobInfo); JobInfo retrievedJobInfo = jobScheduler.getPendingJob(invalidJobId); assertThat(retrievedJobInfo).isNull(); }
@Test @Config(minSdk = O) public void enqueue_fail() { shadowOf(jobScheduler).failOnJob(99); int result = jobScheduler.enqueue( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build(), new JobWorkItem(new Intent())); assertThat(result).isEqualTo(JobScheduler.RESULT_FAILURE); } }
@Test @Config(minSdk = O) public void enqueue_success() { int result = jobScheduler.enqueue( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build(), new JobWorkItem(new Intent())); assertThat(result).isEqualTo(JobScheduler.RESULT_SUCCESS); }
@Test public void getAllPendingJobs() { JobInfo jobInfo = new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build(); jobScheduler.schedule(jobInfo); assertThat(jobScheduler.getAllPendingJobs()).contains(jobInfo); }
@Test public void cancelSingleJob() { jobScheduler.schedule( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build()); assertThat(jobScheduler.getAllPendingJobs()).isNotEmpty(); jobScheduler.cancel(99); assertThat(jobScheduler.getAllPendingJobs()).isEmpty(); }
@Test @Config(minSdk = N) public void getPendingJob_withValidId() { int jobId = 99; JobInfo originalJobInfo = new JobInfo.Builder(jobId, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build(); jobScheduler.schedule(originalJobInfo); JobInfo retrievedJobInfo = jobScheduler.getPendingJob(jobId); assertThat(retrievedJobInfo).isEqualTo(originalJobInfo); }
@Test public void schedule_success() { int result = jobScheduler.schedule( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build()); assertThat(result).isEqualTo(JobScheduler.RESULT_SUCCESS); }
@Test public void cancelNonExistentJob() { jobScheduler.schedule( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build()); assertThat(jobScheduler.getAllPendingJobs()).isNotEmpty(); jobScheduler.cancel(33); assertThat(jobScheduler.getAllPendingJobs()).isNotEmpty(); }
@Test public void schedule_fail() { shadowOf(jobScheduler).failOnJob(99); int result = jobScheduler.schedule( new JobInfo.Builder(99, new ComponentName(context, "component_class_name")) .setPeriodic(1000) .build()); assertThat(result).isEqualTo(JobScheduler.RESULT_FAILURE); }