@Override public List<JobInfo> getAllPendingJobs() throws RemoteException { int vuid = VBinder.getCallingUid(); List<JobInfo> jobs = mScheduler.getAllPendingJobs(); synchronized (mJobStore) { Iterator<JobInfo> iterator = jobs.listIterator(); while (iterator.hasNext()) { JobInfo job = iterator.next(); if (!VASettings.STUB_JOB.equals(job.getService().getClassName())) { // Schedule by Host, invisible in VA. iterator.remove(); continue; } Map.Entry<JobId, JobConfig> jobEntry = findJobByVirtualJobId(job.getId()); if (jobEntry == null) { iterator.remove(); continue; } JobId jobId = jobEntry.getKey(); JobConfig config = jobEntry.getValue(); if (jobId.vuid != vuid) { iterator.remove(); continue; } mirror.android.app.job.JobInfo.jobId.set(job, jobId.clientJobId); mirror.android.app.job.JobInfo.service.set(job, new ComponentName(jobId.packageName, config.serviceName)); } } return jobs; }
@Override public boolean isPlatformJobScheduled(JobRequest request) { List<JobInfo> pendingJobs; try { pendingJobs = getJobScheduler().getAllPendingJobs(); } catch (Exception e) { // it's possible that this throws an exception, see https://gist.github.com/vRallev/a59947dd3932d2642641 mCat.e(e); return false; } //noinspection ConstantConditions if (pendingJobs == null || pendingJobs.isEmpty()) { return false; } for (JobInfo info : pendingJobs) { if (isJobInfoScheduled(info, request)) { return true; } } return false; }
public List<JobInfo> getAllPendingJobsFromScheduler() { JobScheduler jobScheduler = getJobScheduler(); ArrayList<JobInfo> jobs = new ArrayList<>(jobScheduler.getAllPendingJobs()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Iterator<JobInfo> iterator = jobs.iterator(); while (iterator.hasNext()) { if (iterator.next().getId() == JobIdsInternal.JOB_ID_JOB_RESCHEDULE_SERVICE) { iterator.remove(); } } } return jobs; } }
@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 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 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 @Config(sdk = 21) public void verifyPeriodicJobRescheduled() throws Exception { assertThat(manager().getAllJobRequests()).isEmpty(); ContentValues contentValues = new JobRequest.Builder("tag") .setPeriodic(TimeUnit.HOURS.toMillis(1)) .build() .toContentValues(); manager().getJobStorage().getDatabase() .insert(JobStorage.JOB_TABLE_NAME, null, contentValues); Set<JobRequest> requests = manager().getAllJobRequests(); assertThat(requests).isNotEmpty(); JobScheduler scheduler = (JobScheduler) context().getSystemService(Context.JOB_SCHEDULER_SERVICE); assertThat(scheduler.getAllPendingJobs()).isEmpty(); int rescheduledJobs = new JobRescheduleService().rescheduleJobs(manager()); assertThat(rescheduledJobs).isEqualTo(1); }
private static boolean isJobPollServiceOn(Context context) { JobScheduler scheduler = (JobScheduler) context .getSystemService(Context.JOB_SCHEDULER_SERVICE); for (JobInfo jobInfo : scheduler.getAllPendingJobs()) { if (jobInfo.getId() == UPDATE_WIDGET_JOB_ID) { return true; } } return false; }
private boolean isJobRunning(Context context) { boolean isScheduled = false; JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (scheduler != null) { for (JobInfo jobInfo : scheduler.getAllPendingJobs()) { if (jobInfo.getId() == JOB_ID) { isScheduled = true; break; } } } return isScheduled; } }
/** * Executed when user clicks on FINISH LAST TASK. */ public void finishJob(View v) { JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); List<JobInfo> allPendingJobs = jobScheduler.getAllPendingJobs(); if (allPendingJobs.size() > 0) { // Finish the last one int jobId = allPendingJobs.get(0).getId(); jobScheduler.cancel(jobId); Toast.makeText( MainActivity.this, String.format(getString(R.string.cancelled_job), jobId), Toast.LENGTH_SHORT).show(); } else { Toast.makeText( MainActivity.this, getString(R.string.no_jobs_to_cancel), Toast.LENGTH_SHORT).show(); } }
@Override public void onReceive(Context context, Intent intent) { JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); // If there are not pending jobs. Create a sync job and schedule it. List<JobInfo> pendingJobs = jobScheduler.getAllPendingJobs(); if (pendingJobs.isEmpty()) { String inputId = context.getSharedPreferences(EpgSyncJobService.PREFERENCE_EPG_SYNC, Context.MODE_PRIVATE).getString(EpgSyncJobService.BUNDLE_KEY_INPUT_ID, null); if (inputId != null) { // Set up periodic sync only when input has set up. EpgSyncJobService.setUpPeriodicSync(context, inputId, new ComponentName(context, SampleJobService.class)); } return; } // On L/L-MR1, reschedule the pending jobs. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { for (JobInfo job : pendingJobs) { if (job.isPersisted()) { jobScheduler.schedule(job); } } } } }
private android.app.job.JobInfo getPendingJob(int jobId) { List<android.app.job.JobInfo> jobs = jobScheduler.getAllPendingJobs(); for (android.app.job.JobInfo job : jobs) { if (job.getId() == jobId) { return job; } } return null; }
@Override public List<JobInfo> getAllPendingJobs() throws RemoteException { int vuid = VBinder.getCallingUid(); List<JobInfo> jobs = mScheduler.getAllPendingJobs(); synchronized (mJobStore) { Iterator<JobInfo> iterator = jobs.listIterator(); while (iterator.hasNext()) { JobInfo job = iterator.next(); if (!VASettings.STUB_JOB.equals(job.getService().getClassName())) { // Schedule by Host, invisible in VA. iterator.remove(); continue; } Map.Entry<JobId, JobConfig> jobEntry = findJobByVirtualJobId(job.getId()); if (jobEntry == null) { iterator.remove(); continue; } JobId jobId = jobEntry.getKey(); JobConfig config = jobEntry.getValue(); if (jobId.vuid != vuid) { iterator.remove(); continue; } mirror.android.app.job.JobInfo.jobId.set(job, jobId.clientJobId); mirror.android.app.job.JobInfo.service.set(job, new ComponentName(jobId.packageName, config.serviceName)); } } return jobs; }
@Override public List<JobInfo> getAllPendingJobs() { int vuid = VBinder.getCallingUid(); List<JobInfo> jobs = mScheduler.getAllPendingJobs(); synchronized (mJobStore) { Iterator<JobInfo> iterator = jobs.listIterator(); while (iterator.hasNext()) { JobInfo job = iterator.next(); if (!VASettings.STUB_JOB.equals(job.getService().getClassName())) { // Schedule by Host, invisible in VA. iterator.remove(); continue; } Map.Entry<JobId, JobConfig> jobEntry = findJobByVirtualJobId(job.getId()); if (jobEntry == null) { iterator.remove(); continue; } JobId jobId = jobEntry.getKey(); JobConfig config = jobEntry.getValue(); if (jobId.vuid != vuid) { iterator.remove(); continue; } mirror.android.app.job.JobInfo.jobId.set(job, jobId.clientJobId); mirror.android.app.job.JobInfo.service.set(job, new ComponentName(jobId.packageName, config.serviceName)); } } return jobs; }
@Override public boolean isPlatformJobScheduled(JobRequest request) { List<JobInfo> pendingJobs; try { pendingJobs = getJobScheduler().getAllPendingJobs(); } catch (Exception e) { // it's possible that this throws an exception, see https://gist.github.com/vRallev/a59947dd3932d2642641 mCat.e(e); return false; } //noinspection ConstantConditions if (pendingJobs == null || pendingJobs.isEmpty()) { return false; } for (JobInfo info : pendingJobs) { if (isJobInfoScheduled(info, request)) { return true; } } return false; }
/** * Schedules a new media library scan job. * * @return true if job was scheduled, false otherwise */ public static boolean scheduleUpdate(Context context) { JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); ComponentName componentName = new ComponentName(context, ScheduledLibraryUpdate.class); JobInfo job = new JobInfo.Builder(JOB_ID_UPDATE, componentName) .setRequiresCharging(true) .setRequiresDeviceIdle(true) .setPeriodic(3600000 * 32) // run at most every ~32 hours .build(); for (JobInfo pj : scheduler.getAllPendingJobs()) { if (jobsEqual(pj, job)) { return false; } } scheduler.schedule(job); return true; }
private void startAlarms() { appendLog(this, TAG, "scheduleStart at boot, SDK=", Build.VERSION.SDK_INT); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { JobScheduler jobScheduler = getSystemService(JobScheduler.class); boolean scheduled = false; for (JobInfo jobInfo: jobScheduler.getAllPendingJobs()) { if (jobInfo.getId() > 0) { appendLog(this, TAG, "scheduleStart does not start - it's scheduled already"); scheduled = true; break; } } if (!scheduled) { appendLog(this, TAG, "scheduleStart at MainActivity"); AppPreference.setLastSensorServicesCheckTimeInMs(this, 0); jobScheduler.cancelAll(); ComponentName serviceComponent = new ComponentName(this, StartAutoLocationJob.class); JobInfo.Builder builder = new JobInfo.Builder(StartAutoLocationJob.JOB_ID, serviceComponent); builder.setMinimumLatency(1 * 1000); // wait at least builder.setOverrideDeadline(3 * 1000); // maximum delay jobScheduler.schedule(builder.build()); } } else { Intent intentToStartUpdate = new Intent("org.thosp.yourlocalweather.action.START_ALARM_SERVICE"); intentToStartUpdate.setPackage("org.thosp.yourlocalweather"); startService(intentToStartUpdate); } }
@Test public void testCancelJob() { scheduler.schedule(createJob(0)); scheduler.cancel(0); assertEquals(0, jobScheduler.getAllPendingJobs().size()); }
@Test public void testCancelAllBroadcasts() { scheduler.schedule(createJob(0)); scheduler.schedule(createJob(1)); scheduler.schedule(createJob(2)); scheduler.cancelAll(); assertEquals(0, jobScheduler.getAllPendingJobs().size()); }