2014-12-31 11 views
8

새로운 JobScheduler (tatarka에 의한 호환성)로 백그라운드 새로 고침 서비스를 구현하려고합니다. 여기 내 서비스 여기Android JobScheduler는 항상 1 분 동안 작동합니다.

@Override 
public boolean onStartJob(JobParameters params) { 
    Timber.i("on start job: " + params.getJobId()); 
    return true; 
} 

@Override 
public boolean onStopJob(JobParameters params) { 
    Timber.i("on stop job: " + params.getJobId()); 
    return true; 
} 

입니다 내 JobInfo 로그에서

public void scheduleJob(View v) { 
    JobInfo job = new JobInfo.Builder(kJobId++ /*jobid*/, new ComponentName(getActivity(), RefreshJobService.class)) 
      .setPeriodic(2000) 
      .build(); 
    mTestService.scheduleJob(job); 
} 

난 내 직업은 항상 일분 12-31 12:38:03.884 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:39:03.891 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:40:03.911 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:42:08.841 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:43:08.858 10059-10059/@/RefreshJobService﹕ on stop job: 0

왜 작동 볼? 나는 2000ms로 주기적으로 설정되어있다. 어떤 값이라도 1 분 간격으로 영향을 미치지는 않는다. 왜?

+2

왜 이것이 었는지 알아 냈습니까? – Papajohn000

+0

@ Papajohn000 아니, 그렇지 않았다. – onCreate

+1

여전히 관련성이 있지만 작업 스케줄러의 최소 시간 제한이있을 수 있습니다. 나는 Alarm Manager가 2 분 최소 한계를 가지고 있다는 것을 알고있다. – Papajohn000

답변

3

작업 시작 후 정확히 1 분 후에 onStopJob에 도착하는 이유는 무엇입니까? 이 1 분 제한 시간은 코드 here

0

43matthew에 정의되어 있습니다. 그러나이 부분에 더 많은 것을 추가하고 싶습니다. 당신이 말하는 2000ms는 작업이 다시 시작되는주기 즉, 이 작업이 실행될 간격이 아닌 2000 년마다이 작업을 실행합니다.

+0

나는 이것이 정확하다고 생각하지 않는다; Android는 2000ms 간격으로 "최대 한 번"실행됩니다. 이것은 (a) 간격이며 (b) 그 기간 동안 귀하의 직업을 전혀 수행하지 않을 수 있음을 의미합니다. – Tom

6

Android 5.1.1까지 단일 작업에 대해 60 초의 시간 초과가있었습니다. 안드로이드 6부터는 타임 아웃이 10 분입니다.

6

onStopJob은 시스템에서 작업 취소를 원할 때 호출됩니다. 직장을 취소하는 이유는 그것이 여전히 운영되고 있다고 생각하기 때문입니다. 스케줄러에게 완료되었음을 알리기 위해 작업 중 어느 시점에 jobFinished(params, bool)에 전화해야합니다. 그렇지 않으면 시간 초과되어 onStopJob으로 전화하여 취소합니다. 또한 onStartJob에서 'true'를 반환하면 처리가 완료되지 않았 음을 시스템에 알립니다. 여전히 추가 작업을하지 않는 한 '거짓'을 반환해야합니다. 작업을 별도의 스레드로 전달합니다.

@Override 
public boolean onStartJob(JobParameters params) { 
    Timber.i("on start job: " + params.getJobId()); 
    jobFinished(params, false); 
    return false; 
} 
2

API 26 (Oreo)에서 주기적 작업의 경우 15 분보다 작은주기를 설정하면 적어도 15 분 후에 실행됩니다.