2017-04-04 109 views
2

使用JobScheduler,我建立一个简单的JobService如下:周期的jobscheduler不尊重约束

@TargetApi(21) 
public class SimpleJobService extends JobService { 
    private static final String TAG = "SimpleJobService"; 

    @Override 
    public boolean onStartJob(JobParameters jobParameters) { 
     if (jobParameters.isOverrideDeadlineExpired()) { 
      Log.d(TAG, "This shouldn't happen"); 
      Toast.makeText(this, "This shouldn't happen", Toast.LENGTH_LONG).show(); 
     } 
     jobFinished(jobParameters, false); 

     return true; 
    } 

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

我然后设置所述JobService为周期性的(每分钟)和未计量的需要网络和计费:

ComponentName jobServiceComponent = new ComponentName(this, SimpleJobService.class); 

    JobInfo.Builder builder = new JobInfo.Builder(2, jobServiceComponent); 
    builder.setPersisted(true); 
    builder.setPeriodic(60000); 
    builder.setRequiresCharging(true); 

    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 
    JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); 
    jobScheduler.schedule(builder.build()); 

的我SimpleJobServiceonStartJob正在无论我的设备是否正在充电称为或者如果它是一个计量的网络上。

setPeriodic(long)的文件说,它不能配合使用setOverrideDeadline(long)(我不这样),但我很惊讶,jobParameters.isOverrideDeadlineExpired()onStartJob是有史以来true与此设置。

我在这里错过了什么吗?

这看起来像一个Android的bug,但我很惊讶,我找不到其他人报告这个问题。

,此行为已观察到在Android 6.0.1

回答

2

周期性工作都有所看到的the source code期结束的最后期限隐。

就像明确设定最后期限一样,这可以让您有机会决定如何在您的条件下最好地处理延长的时间段(您会注意到存在最小时间间隔,可在Android 7.0及更高版本的设备上进行查询)没有得到满足。例如,如果您的约束条件很难满足要求,则可以致电jobFinished(jobParameters, false)等待下一个周期性终点或条件为真。

+0

不错的地方。如果这是有意的行为,我当然认为它可以在API文档中保留一个评论,比如'setOverrideDeadline()'上的评论,因为不小心很容易被它绊住 - 例如,在计量网络上传输大量数据。 – HexAndBugs

+0

虽然这个描述似乎是一个完全合理的方式来实现JobScheduler,我认为这里肯定有bug。进一步的测试表明,如果我从'onStartJob'调用'jobFinished(jobParameters,true)',那么这个工作就不会被重新安排,直到工作的其他标准为真,而如果它故意使用这个时间段作为某种截止期限,然后期望它应用退休标准,按照我的要求重新安排工作,继续忽略其他标准。这种行为似乎与我不一致! – HexAndBugs

+0

是的,退职的职位没有与他们相关的覆盖期限,这包括由定期工作设置的隐式覆盖期限。 – ianhanniballake