2017-04-04 110 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