17

毎日決まった時間にJobSchedulerを起動し、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 以外に、この問題に対する他の解決策がある場合は、大歓迎です。

4

2 に答える 2

1

現在時刻とターゲット時刻の差異を使用して jobInfo に setMinimumLatency を追加すると、この問題が解決されます。

JobInfo jobInfo = new JobInfo.Builder(1, componentName)
                .setPersisted(true)
                .setBackoffCriteria(6000, JobInfo.BACKOFF_POLICY_LINEAR)
                .setMinimumLatency(1000 * 60)
                .build();

上記の例では、スケジューラは 60 秒後に機能します。

于 2018-07-31T20:20:59.820 に答える