JobWorkEnqueuer(Context context, ComponentName cn, int jobId) { super(context, cn); ensureJobId(jobId); JobInfo.Builder b = new JobInfo.Builder(jobId, mComponentName); mJobInfo = b.setOverrideDeadline(0).build(); mJobScheduler = (JobScheduler) context.getApplicationContext().getSystemService( Context.JOB_SCHEDULER_SERVICE); }
@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); } }
.setExtras(job.toPersistableBundle()); if (Preferences.Offline.currentConnectionEnabled(context)) { builder.setOverrideDeadline(0);
public static void registerJob(Context context, long intervalMinutes) { JobScheduler jss = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jss.cancel(JOB_ID); long interval = intervalMinutes * MINUTES; long jitter = (long)(INTERVAL_JITTER_FRAC * interval); interval += (long)(Math.random() * (2 * jitter)) - jitter; final JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(context, NekoService.class)) .setMinimumLatency(interval) .setOverrideDeadline(interval + 1000) .build(); Log.v(TAG, "A cat will visit in " + interval + "ms: " + String.valueOf(jobInfo)); jss.schedule(jobInfo); if (NekoLand.DEBUG_NOTIFICATIONS) { NotificationManager noman = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); noman.notify(500, new Notification.Builder(context) .setSmallIcon(R.drawable.stat_icon) .setContentTitle(String.format("Job scheduled in %d min", (interval / MINUTES))) .setContentText(String.valueOf(jobInfo)) .setPriority(Notification.PRIORITY_MIN) .setCategory(Notification.CATEGORY_SERVICE) .setShowWhen(true) .build()); } }
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 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()); } }
private void resendTheIntentInSeveralSeconds(int seconds) { appendLog(getBaseContext(), TAG, "resendTheIntentInSeveralSeconds:SDK:", Build.VERSION.SDK_INT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ComponentName serviceComponent = new ComponentName(this, CurrentWeatherResendJob.class); JobInfo.Builder builder = new JobInfo.Builder(CurrentWeatherResendJob.JOB_ID, serviceComponent); builder.setMinimumLatency(seconds * 1000); // wait at least builder.setOverrideDeadline((3 + seconds) * 1000); // maximum delay JobScheduler jobScheduler = getSystemService(JobScheduler.class); jobScheduler.schedule(builder.build()); appendLog(getBaseContext(), TAG, "resendTheIntentInSeveralSeconds: sent"); } else { AlarmManager alarmManager = (AlarmManager) getBaseContext().getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(getBaseContext(), CurrentWeatherService.class), PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + (1000 * seconds), pendingIntent); } }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private static void listing11_11(Context context) { JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); ComponentName jobServiceName = new ComponentName(context, BackgroundJobService.class); // Listing 11-11: Scheduling a job with customized back-off criteria jobScheduler.schedule( new JobInfo.Builder(BACKGROUND_UPLOAD_JOB_ID, jobServiceName) // Require a network connection .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) // Require the device has been idle .setRequiresDeviceIdle(true) // Force Job to ignore constraints after 1 day .setOverrideDeadline(TimeUnit.DAYS.toMillis(1)) // Retry after 30 seconds, with linear back-off .setBackoffCriteria(30000, JobInfo.BACKOFF_POLICY_LINEAR) // Reschedule after the device has been rebooted .setPersisted(true) .build()); }
private void resendTheIntentInSeveralSeconds(int seconds) { if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { ComponentName serviceComponent = new ComponentName(this, WeatherForecastResendJob.class); JobInfo.Builder builder = new JobInfo.Builder(WeatherForecastResendJob.JOB_ID, serviceComponent); builder.setMinimumLatency(seconds * 1000); // wait at least builder.setOverrideDeadline((3 + seconds) * 1000); // maximum delay JobScheduler jobScheduler = getSystemService(JobScheduler.class); jobScheduler.schedule(builder.build()); } else { AlarmManager alarmManager = (AlarmManager) getBaseContext().getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(getBaseContext(), ForecastWeatherService.class), PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + (1000 * seconds), pendingIntent); } }
private void scheduleJob(int id, int jobId, String key) { PersistableBundle bundle = new PersistableBundle(); bundle.putInt(NotificationJobService.NOTIFICATION_MODE, id); bundle.putString(NotificationJobService.NOTIFICATION_KEY, key); JobInfo.Builder builder = new JobInfo.Builder(jobId, serviceComponent); if (jobId == 0) { builder.setPeriodic(120 * 1000L); } else { if (id == NotificationJobService.NOTIFICATION_POSTED_CUSTOM_UI && (!Prefs.getBoolean(Constants.PREF_DISABLE_STANDARD_NOTIFICATIONS, false))) builder.setMinimumLatency(CUSTOMUI_LATENCY); else builder.setMinimumLatency(0); builder.setBackoffCriteria(JOB_INTERVAL, JobInfo.BACKOFF_POLICY_LINEAR); builder.setOverrideDeadline(JOB_MAX_INTERVAL); builder.setExtras(bundle); } jobScheduler.schedule(builder.build()); }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public static void scheduleBackgroundUpload(Context context) { // Access the Job Scheduler JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); // Get a reference to my Job Service implementation ComponentName jobServiceName = new ComponentName( context, BackgroundJobService.class); // Build a Job Info to run my Job Service jobScheduler.schedule( new JobInfo.Builder(BACKGROUND_UPLOAD_JOB_ID, jobServiceName) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setRequiresCharging(true) // Wait at most a day before relaxing our network constraints .setOverrideDeadline(TimeUnit.DAYS.toMillis(1)) .build()); }
protected JobInfo.Builder createBuilderOneOff(JobInfo.Builder builder, long startMs, long endMs) { return builder.setMinimumLatency(startMs).setOverrideDeadline(endMs); }
private void scheduleJob() { Intent serviceIntent = new Intent(this, NetworkSchedulerService.class); startService(serviceIntent); JobInfo myJob = new JobInfo.Builder(0, new ComponentName(this, NetworkSchedulerService.class)) .setRequiresCharging(false) .setMinimumLatency(3000) .setOverrideDeadline(2000) .setRequiresDeviceIdle(false) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) .build(); JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(myJob); }
private void scheduleStart(Context context) { appendLog(context, TAG, "scheduleStart at boot, SDK=", Build.VERSION.SDK_INT); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { ComponentName serviceComponent = new ComponentName(context, 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 jobScheduler = context.getSystemService(JobScheduler.class); jobScheduler.schedule(builder.build()); } else { Intent intentToStartUpdate = new Intent("org.thosp.yourlocalweather.action.START_ALARM_SERVICE"); intentToStartUpdate.setPackage("org.thosp.yourlocalweather"); context.startService(intentToStartUpdate); } }
public JobInfo getJobInfo() { ComponentName serviceComponent = new ComponentName(getApplicationContext(), MyJobWorkService.class); JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent); builder.setMinimumLatency(10 * 1000); // wait at least builder.setOverrideDeadline(30 * 1000); // maximum delay //builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); // require unmetered network //builder.setRequiresDeviceIdle(true); // device should be idle //builder.setRequiresCharging(false); // we don't care if the device is charging or not //builder.setRequiresBatteryNotLow(true); //only when the batter is not low. API 26+ return builder.build(); }
protected void reScheduleNextAlarm(int jobId, long updatePeriod, Class serviceClass) { appendLog(getBaseContext(), TAG, "next alarm:", updatePeriod, ", serviceClass=", serviceClass); ComponentName serviceComponent = new ComponentName(this, serviceClass); JobInfo.Builder builder = new JobInfo.Builder(jobId, serviceComponent); builder.setMinimumLatency(updatePeriod); // wait at least builder.setOverrideDeadline(updatePeriod + (3 * 1000)); // maximum delay JobScheduler jobScheduler = getSystemService(JobScheduler.class); jobScheduler.schedule(builder.build()); }
.setExtras(new PersistableBundle()) .setMinimumLatency(millisToNextJobStart) .setOverrideDeadline(millisToNextJobStart).build(); int error = jobScheduler.schedule(immediateJob); if (error < 0) {
@SuppressLint("SwitchIntDef") @Override public void request(SchedulerConstraint constraint) { JobScheduler jobScheduler = getJobScheduler(); final int id = createId(); JobInfo.Builder builder = new JobInfo.Builder(id, getComponentName()) .setExtras(toPersistentBundle(constraint)) .setPersisted(true); switch (constraint.getNetworkStatus()) { case NetworkUtil.UNMETERED: builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); break; case NetworkUtil.METERED: builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); break; default: builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE); builder.setRequiresDeviceIdle(true); break; } if (constraint.getDelayInMs() > 0) { builder.setMinimumLatency(constraint.getDelayInMs()); } if (constraint.getOverrideDeadlineInMs() != null) { builder.setOverrideDeadline(constraint.getOverrideDeadlineInMs()); } int scheduled = jobScheduler.schedule(builder.build()); JqLog.d("[FW Scheduler] scheduled a framework job. Success? %s id: %d" + " created id: %d", scheduled > 0, scheduled, id); }
@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(); } }
protected JobInfo.Builder createBuilderOneOff(JobInfo.Builder builder, long startMs, long endMs) { return builder.setMinimumLatency(startMs).setOverrideDeadline(endMs); }