如何使用JobScheduler指定Android定期作业的初始延迟?

时间:2018-01-08 11:49:10

标签: java android kotlin jobs android-jobscheduler

我想创建一个具有特定时间和给定周期的正在运行的作业。例如,我想在每个月的第二天安排一份工作,它应该每个月运行一次。

查看JobInfo.Builder documentation我找不到设置初始延迟的方法。

关于如何实现这一点的任何想法?

这是以正确的周期运行的代码,但没有我想要的初始延迟:

fun build(application: Application, periodicity: Days, startDay: Days) {
        val serviceComponent = ComponentName(application, GenerateDebtJobService::class.java)
        val builder = JobInfo.Builder(1, serviceComponent)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .setPeriodic(TimeUnit.DAYS.toMillis(periodicity.days.toLong()))

        (application.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler).schedule(builder.build())

4 个答案:

答案 0 :(得分:1)

您无法为定期作业应用初始延迟。目前应该使用一次性作业进行初始延迟,然后使用周期性间隔安排新的定期作业。

答案 1 :(得分:0)

答案 2 :(得分:0)

确实,没有开箱即用的方法。我使用SharedPreferences来检测第一个作业。示例:

public class MyReminder extends JobService {
    private static final String TAG = "MyReminder";
    private static final String IS_FIRST_RUN_KEY = "MyReminder.isFirstRun";

    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        if (isFirstRun()) {
            // just skip it, will mark as first run and 
            // will do the real thing next time
            markFirstRunComplete();
        } else {
            // do the real thing here, show a notification, whatever...
        }
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        return false;
    }

    private boolean isFirstRun() {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        return sharedPreferences.getBoolean(IS_FIRST_RUN_KEY, true);
    }

    private void markFirstRunComplete() {
        Log.d(TAG, "mark first run complete");
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(IS_FIRST_RUN_KEY, false);
        editor.apply();
    }
}

答案 3 :(得分:-1)

从API 24开始,可以使用setPeriodic(长间隔,长弹性) 确保在flex和提供的间隔之间的任何时间运行您的作业:

see documentation