@Override public boolean schedule(Requirements requirements, String servicePackage, String serviceAction) { JobInfo jobInfo = buildJobInfo(jobId, jobServiceComponentName, requirements, serviceAction, servicePackage); int result = jobScheduler.schedule(jobInfo); logd("Scheduling job: " + jobId + " result: " + result); return result == JobScheduler.RESULT_SUCCESS; }
static void schedule(Context ctxt) { ComponentName cn= new ComponentName(ctxt, DemoJobService.class); JobInfo.TriggerContentUri trigger= new JobInfo.TriggerContentUri(CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS); JobInfo.Builder b= new JobInfo.Builder(ME_MYSELF_AND_I, cn) .addTriggerContentUri(trigger); JobScheduler jobScheduler= (JobScheduler)ctxt.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(b.build()); }
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 JobInfo schedule(SchedulerConstraint constraint) { ArgumentCaptor<JobInfo> infoCaptor = ArgumentCaptor.forClass(JobInfo.class); when(mockJobScheduler.schedule(infoCaptor.capture())).thenReturn(1); fwScheduler.request(constraint); verify(mockJobScheduler).schedule(Mockito.any(JobInfo.class)); verify(mockEditor).putInt(FrameworkScheduler.KEY_ID, 1); return infoCaptor.getValue(); } }
@Override public void scheduleReportSending(boolean onlySendSilentReports) { final Intent intent = new Intent(); intent.putExtra(LegacySenderService.EXTRA_ONLY_SEND_SILENT_REPORTS, onlySendSilentReports); intent.putExtra(LegacySenderService.EXTRA_ACRA_CONFIG, config); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); PersistableBundle extras = new PersistableBundle(); extras.putString(LegacySenderService.EXTRA_ACRA_CONFIG, IOUtils.serialize(config)); extras.putBoolean(LegacySenderService.EXTRA_ONLY_SEND_SILENT_REPORTS, onlySendSilentReports); assert scheduler != null; JobInfo.Builder builder = new JobInfo.Builder(0, new ComponentName(context, JobSenderService.class)).setOverrideDeadline(0L).setExtras(extras); configureJob(builder); scheduler.schedule(builder.build()); } else { intent.setComponent(new ComponentName(context, LegacySenderService.class)); context.startService(intent); } }
@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()); }
@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()); } } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); JobScheduler jobs= (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE); ComponentName cn=new ComponentName(this, LongJobService.class); JobInfo.Builder b=new JobInfo.Builder(JOB_ID, cn) .setMinimumLatency(30000) .setOverrideDeadline(60000) .setPersisted(false) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setRequiresCharging(false) .setRequiresDeviceIdle(false); jobs.schedule(b.build()); Toast.makeText(this, R.string.msg_start, Toast.LENGTH_LONG).show(); finish(); } }
@Override public int schedule(JobInfo job) throws RemoteException { int vuid = VBinder.getCallingUid(); int id = job.getId(); ComponentName service = job.getService(); JobId jobId = new JobId(vuid, service.getPackageName(), id); JobConfig config = mJobStore.get(jobId); if (config == null) { config = new JobConfig(mGlobalJobId++, service.getClassName(), job.getExtras()); mJobStore.put(jobId, config); } else { config.serviceName = service.getClassName(); config.extras = job.getExtras(); } saveJobs(); mirror.android.app.job.JobInfo.jobId.set(job, config.virtualJobId); mirror.android.app.job.JobInfo.service.set(job, mJobProxyComponent); return mScheduler.schedule(job); }
@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 @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 @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 public void verifyErrorAsyncDailyJob() throws Exception { JobConfig.setClock(new TestClock()); JobScheduler jobScheduler = mock(JobScheduler.class); when(jobScheduler.schedule(any(JobInfo.class))).thenThrow(new RuntimeException("test")); when(context().getSystemService(Context.JOB_SCHEDULER_SERVICE)).thenReturn(jobScheduler); final AtomicReference<Exception> reference = new AtomicReference<>(); DailyJob.scheduleAsync(DummyJobs.createBuilder(DummyJobs.SuccessJob.class), 1000, 2000, new JobRequest.JobScheduledCallback() { @Override public void onJobScheduled(int jobId, @NonNull String tag, @Nullable Exception exception) { assertThat(jobId).isEqualTo(JOB_ID_ERROR); reference.set(exception); } }); waitUntilScheduled(); assertThat(reference.get()).isInstanceOf(RuntimeException.class); }
@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 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 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); }
@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 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(); }
@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); } }