@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; }
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); } }
@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 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_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); }
boolean alreadyScheduled = false; if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { JobInfo job = scheduler.getPendingJob(CONNECTIVITY_CHANGE_JOB_ID); if(job != null) alreadyScheduled = true; } else { for(JobInfo jobInfo: scheduler.getAllPendingJobs()) { if(jobInfo.getId() == CONNECTIVITY_CHANGE_JOB_ID) { alreadyScheduled = true; int result = scheduler.schedule(jobInfo); if(result == JobScheduler.RESULT_FAILURE) { Log.e(TAG, "enable(): Couldn't schedule JobScheduler job"); scheduler.cancel(CONNECTIVITY_CHANGE_JOB_ID);
@Override public boolean cancel() { logd("Canceling job: " + jobId); jobScheduler.cancel(jobId); return true; }
@Override public void onCreate() { super.onCreate(); appendLog(this, TAG,"Default locale:", Resources.getSystem().getConfiguration().locale.getLanguage()); PreferenceManager.getDefaultSharedPreferences(this) .edit() .putString(Constants.PREF_OS_LANGUAGE, Resources.getSystem().getConfiguration().locale.getLanguage()) .apply(); LanguageUtil.setLanguage(this, PreferenceUtil.getLanguage(this)); sTheme = PreferenceUtil.getTheme(this); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { JobScheduler jobScheduler = getSystemService(JobScheduler.class); appendLog(this, TAG, "scheduleStart at YourLocalWeather"); 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()); } }
/** * 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 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; }
@TargetApi(Build.VERSION_CODES.O) static void cancelJobs(Context ctxt) { ctxt.getSystemService(JobScheduler.class).cancelAll(); } }
@Override public boolean isPlatformJobScheduled(JobRequest request) { try { return isJobInfoScheduled(getJobScheduler().getPendingJob(request.getJobId()), request); } catch (Exception e) { mCat.e(e); return false; } }
@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(); }
public void cancelSchedule(Context context) { JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.cancel(ScanJob.getImmediateScanJobId(context)); jobScheduler.cancel(ScanJob.getPeriodicScanJobId(context)); if (mBeaconNotificationProcessor != null) { mBeaconNotificationProcessor.unregister(); } }
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 @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(); }
public static void scheduleJobService(Context context) { boolean isSuccess = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(context, JobSchedulerService.class)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { builder.setMinimumLatency(DaemonUtil.getIntervalTime()); builder.setOverrideDeadline(DaemonUtil.getIntervalTime() * 2); builder.setBackoffCriteria(DaemonUtil.getIntervalTime(), JobInfo.BACKOFF_POLICY_LINEAR);//线性重试方案 } else { builder.setPeriodic(DaemonUtil.getIntervalTime()); } builder.setPersisted(true); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (jobScheduler != null) { jobScheduler.cancelAll(); isSuccess = jobScheduler.schedule(builder.build()) == JobScheduler.RESULT_SUCCESS; } } if (isSuccess) { Log.d(TAG, "Scheduler Success!"); } else { Log.e(TAG, "Scheduler Failed!"); } }
@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; }
@Override public void cancelAll() { JqLog.d("[FW Scheduler] cancel all"); getJobScheduler().cancelAll(); }