JobSchedulerを特定の時間everydayに開始し、3時間後に終了したいのですが。
20分ごとに3時間、ジョブをトリガーする部分がありますが、JobInfo.Builderクラスには、正確な時間にジョブを開始するオプションがありません。
JobInfo.Builder クラスの概要を確認すると、JobSchedulerを開始する時間を設定するものはありません。
明らかに、私はそれを一日中実行したくありません、そして時間が一致することを確認します、これは必要以上に多くの電池を消耗するでしょう、そして悪いプログラミングです。
指定した時間にアラームを実行してこのジョブをトリガーすることを考えていましたが、これは少しやりすぎに思われます
JobInfo.Builder builder = new JobInfo.Builder(NIGHT_SYNC_JOB_ID,
new ComponentName(context, NightSyncDataJobService.class));
//Job starts at 11pm, and ends at 2am. Running every 20 minutes.
builder.setPersisted(true); //Job scheduled to work after reboot
builder.setPeriodic(Consts.ONE_MINUTE * 20);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
このJobSchedulerをトリガーするAlarmManger以外に、この問題に対する他の解決策がある場合は、高く評価されます。
私は次の方法で(AlarmManager
なしで)達成し、新しいジョブを作成し(一意の_JOB_ID
_を使用して明らかに)、将来的にJobScheduler
にスケジュールするように伝えましたsetOverrideDeadline()
を使用します。
役立つかもしれないスニペットは次のとおりです。
_private JobInfo getJobInfoForFutureTask(Context context,
long timeTillFutureJob) {
ComponentName serviceComponent = new ComponentName(context, SchedulerService.class);
return new JobInfo.Builder(FUTURE_JOB_ID, serviceComponent)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
.setOverrideDeadline(timeTillFutureJob)
.setRequiresDeviceIdle(false)
.setRequiresCharging(false)
.setPersisted(true)
.build();
}
_
タスクをスケジュールする正しい時間オフセットを計算し、既存のジョブIDをJobScheduler
から削除してください。
現在の時刻と目標時刻の差を使用してjobInfoにsetMinimumLatencyを追加すると、この問題が解決します。
JobInfo jobInfo = new JobInfo.Builder(1, componentName)
.setPersisted(true)
.setBackoffCriteria(6000, JobInfo.BACKOFF_POLICY_LINEAR)
.setMinimumLatency(1000 * 60)
.build();
上記の例では、スケジューラーは60秒後に機能します。