建議收boot_complte 廣播重新開機 在receiver中初始化JobSchedule
5分鐘後開啓
public void scheduleRegularJob(Context context) { Log.d("RegularSmsJobService", "scheduleRegularJob in 5mins:"+System.currentTimeMillis()); if (VersionControlUtils.isLollipopOrLater()) { mServiceComponent = new ComponentName(context, RegularSmsJobService.class); JobInfo.Builder builder = new JobInfo.Builder(RegularJobId, mServiceComponent); //builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); builder.setMinimumLatency(4 * 60 * 1000L); builder.setOverrideDeadline(5 * 60 * 1000L); JobScheduler tm = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); PersistableBundle mBundle = new PersistableBundle(); mBundle.putString("key", "first_after_bootcomplete"); builder.setExtras(mBundle); int jobId = tm.schedule(builder.build()); LenovoSharedPreferenceUtils.setSharedPreference(context, LenovoSharedPreferenceUtils.PREF_JOBID_NETWORK, jobId); } }
一定要加setminimumLatency 不然會直接運行,setOverrideDeadline不起作用
週期運行設置的坑:
public void scheduleRegularJob(Context context) { Log.d(TAG, "schedule job 12 hours periodically"); if (VersionControlUtils.isLollipopOrLater()) { cancelAllJobs(context); mServiceComponent = new ComponentName(context, RegularSmsJobService.class); JobInfo.Builder builder = new JobInfo.Builder(RegularJobIdPeriod, mServiceComponent); //builder.setPeriodic(12 * 60 * 60 * 1000l); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { builder.setPeriodic(START_SERVICE_INTERVAL, 60 * 1000L); } else { builder.setPeriodic(START_SERVICE_INTERVAL); } JobScheduler tm = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); PersistableBundle mBundle = new PersistableBundle(); mBundle.putString("key", "regular_auto_import_birth"); builder.setExtras(mBundle); tm.schedule(builder.build()); } }
把setPeriodic 修改成5mins進行測試,發現不起作用,長期跟蹤發現每15mins運行一次,很奇怪,各種baidu都沒有信息,最後google了一下,發現了
I was having this problem and after review some blogs and the official documentation, I realised that JobScheduler is having difference behavior on
Android N(24 and 25). JobScheduler works with a minimum periodic of 15 mins.
所以,使用setperiodic的時候一定要注意!!!!
對了另外建議, jobschedule 可以在Broadcaster Receiver中初始化,
也可以在JobService中初始化。
onStartJob
這個方法如果另外起線程做一些費事的事情的話,最好返回爲true,
然後在線程運行完成後 調用jobFinished, 不然線程沒執行完成,jobservice就直接onDestory了, 雖然還沒看到這個有什麼影響,如果你要返回結果進行加工顯示就是另外的情況了。
jobFinished(params, false);