[android] JobScheduler 호출 flow 분석 |
JobScheduler(JobSchedulerImpl )
-
JobScheduler 는 abstract class
실제 안드로이드 구현체는 JobSchedulerImpl 이며, 이는 constructor 에 전달된 binder 를 통해 통신을 한다.
-
JobShcedulerImpl 에 전달되는 Binder 는 JobSchedulerService 의 inner class 로 있는 JobSchedulerStub 이다.
Stub 에서는 JobSchedulerService 의 여러 함수로 역할을 위임(delegate) 시킨다.
JobService
-
JobService 도 abstract class 로 startJob, stopJob 을 구현하는 Binder 를 가지고 있다.
즉 JobScheduler 를 통해서는 startJob 과 stopJob 만을 받는다.
각각은 handler 에 MSG_EXECUTE_JOB, MSG_STOP_JOB 를 what 으로 전달받은 JobParameters 와 함께 message 를 던진다.
그리고 JobService 를 구현한 녀석을 통해 jobFinished 가 호출될 수 있고, 이 녀석은 MSG_JOB_FINISHED 를 what 으로 JobParameters 와 함께 handler 에 message 를 던진다.
-
JobService 의 Handler 에서는 하는 일이 별로 없다.
EXECUTE_JOB 와 STOP_JOB 은 각각 JobService 의 onStartJob, onStopJob 을 불러서 return 값을 받아오고, JobParameters 에 들어있는 callback 에 acknowledgeStartMessage 와 acknowledgeStopMessage 를 jobId 를 인자로 하여 각각 불러준다.
JOB_FINISHED 의 경우는 JobParameters 에 들어있는 callback 에 jobId 를 인자로 jobFinished 를 불러준다.
JobServiceContext
JobSchedulerImpl 과 JobService 사이의 연결은 JobServiceContext 가 담당한다.
acknowledgeStartMessage, acknowledgeStopMessage, jobFinished 에서는 JobServiceHandler 라는 callbackHandler 에 전달받은 id 와 message 를 전달한다.
그리고 해당 handler 에서는 VERB_STARTING state 면 handleStartedH, VERB_EXECUTING state 면 handleFinishedH 를 호출한다.
( 마지막 H suffix 는 Handler 에서 부른다는 것을 강조하기 위함인듯 하다. )
-
handleStartedH 에서는 VERB_STARTING state 라면 제대로 start 된 것이기 때문에 VERB_EXECUTING 으로 상태를 바꾸고 ongoing 이면 (cancel 안 되었다면) timeout 을 설정하고, ongoing 이 아니면 바로 handleFinishedH 를 불러준다.
-
handleFinishedH 에서는 VERB_EXECUTING 이나 VERB_STOPPING 상태가 정상적인 상태인데..
VERB_EXECUTING 은 client 가 jobFinished 를 호출한 케이스이고, STOPPING 은 정상적인 종료를 의미한다.
둘 다 closeAndCleanupJobH 를 호출하게 된다.
-
closeAndCleanupJobH 에서는 runningJob 을 가져와서 batteryStat 에 notify 해주고, wakelock 을 해지해준다.
그리고 JobServiceContext 를 unbind 하고 초기화시켜준다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] 화면 고정 기능 (0) | 2018.05.05 |
---|---|
[android] Smart Lock 이란 ( Trust Agents ) (0) | 2018.05.04 |
[android] JobScheduler 의 schedule 이 fail 하는 케이스 (0) | 2018.04.29 |
[android] JobStatus.getUID NullPointerException (0) | 2018.04.28 |
[android] Framework 혹은 3rd-party lib 이 뿜는 Exception 을 피해보자 ( ex) NullPointerException at acm.a ) (0) | 2018.04.22 |
댓글