본문으로 바로가기

Android JobScheduler API #2

category 개발이야기/Android 2017. 10. 27. 01:00
반응형

API21부터 제공하는 JobScheduler에 대하여 이전 포스팅에서 사용방법을 언급했습니다.

Android developer page에서 JobScheduler class에 대한 좀더 상세한 API에 대하여 알아보시죠~


Overview

JobInfo로 Job의 type과 실행조건을 만들고 JobScheduler에게 넘겨줌으로써 system이 정해진 조건을 만났을때 App의 application에서 JobService를 실행하도록 합니다.
JobService는 JobInfo.Builder()로 등록합니다.

또한 Framework은 똑똑하게 가능한 많은 작업을 수행하고 해당 작업을 연기합니다.


JobSchedular의 instance는 아래와 같은 방법으로 얻습니다.

Context.getSystemService(Context.JOB_SCHEDULER_SERVICE)


API

jobId를 넘겨주어 pending된 job을 취소시킴

abstract void cancelAll()
요청한 package에서 등록한 job을 모두 취소 시킴

abstract int enqueue(JobInfo job, JobWorkItem work)
schedule과 비슷하나 신규 job이나 기존 job을 enqueue할 수 있음. 파라미터가 잘못된 경우 RESULT_FAILURE 을 return 한다. 
그외 RESULT_SUCCESS return함.
동일한 ID를 가진 작업이 스케쥴링 되어있는 경우에는 새 JobInfo로 대체되고, 기존에 queue에 등록되어있던 다른 job들은 그대로 유지되어 실행된다. 즉 순서나 다른 job에 영향을 주지않고 대체된다. 단, 이미 동일한 ID가 실행중인상태라면 새 작업으로 queue에 등록된다. 
API26 이라 쓰기엔 쉽지 않을듯...

JobInfo를 enqueue 할때는 동일한 JobInfo를 쓰는것이 추천된다. 같은 JobInfo를 사용함으로써 system이 실행중이나 pending중인 work에따라서 스케쥴링을 최적화 할 수 있다. 예를 들어 JobInfo가 enqueue된 이후에 변경된다면, system은 해당 정보를 update해야 해야 하기 대문에 실행을 방해하는 요소가 된다. 또한 이전 작업(work)을 수행하고 있는 현재 Job을 중지 시키고 새로운 JobInfo가 실행 될 수 있다.

추가적으로 setExtras(PersistableBundle) 나  setTransientExtras(Bundle) 도 JobInfo에 추가하지 않는게 좋다. system은 이 extras을 이전 JobInfo와 비교하는 작업을 해야하면 대부분 다르다고 판단하여 JobInfo가 변경된것으로 간주한다. (아니면 매우 심플한 형태로 넣어서 써야 한다)
또한  setClipData(ClipData, int)를 사용하면 같은 내용이 들어가 있을지라도 무조건 다른 JobInfo라고 판단한다.          
           

요청한 pacakge에서 등록한 모든 job을 반환

abstract JobInfo getPendingJob(int jobId)
jobId을 넘겨주어 요청한 package에서 등록하고 pending되 job을 반환

abstract int schedule(JobInfo job)
JobInfo를 등록, 파라미터가 잘못된 경우 RESULT_FAILURE 을 return 한다. 그외 RESULT_SUCCESS return
같은 ID를 갖는 JobInfo가 등록될 경우 replace 된다.
만약 현재 수행중인 JobInfo와 같은 ID가 요청된다면, 현재 작업이 중단된다!!

참고: https://developer.android.com/reference/android/app/job/JobScheduler.html


반응형