我想创建一个具有特定时间和给定周期的正在运行的作业。例如,我想在每个月的第二天安排一份工作,它应该每个月运行一次。
查看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())
答案 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和提供的间隔之间的任何时间运行您的作业: