web-dev-qa-db-ja.com

Android特定の時間にJobSchedulerの実行を開始します

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以外に、この問題に対する他の解決策がある場合は、高く評価されます。

14
Dus

私は次の方法で(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から削除してください。

8
prerak

現在の時刻と目標時刻の差を使用してjobInfoにsetMinimumLatencyを追加すると、この問題が解決します。

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

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

1
Omar Alnajjar