본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] JobScheduler 호출 flow 분석

by 돼지왕 왕돼지 2018. 4. 30.
반응형

[android] JobScheduler 호출 flow 분석


acknowledgeStartMessage, acknowledgeStopMessage, Android, batteryStat, binder, callbackHandler, closeAndCleanupJobH, delegate, EXECUTE_JOB, handleFinishedH, handler, handleStartedH, jobFinished, JobParameters, jobscheduler, jobscheduler analysis, jobscheduler flow, jobscheduler 분석, JobSchedulerImpl, JobSchedulerService, JobSchedulerStub, JobService, JobServiceContext, MSG_EXECUTE_JOB, MSG_JOB_FINISHED, MSG_STOP_JOB, onStartJob, onStopJob, startJob, stopJob, STOP_JOB, timeout, unbind, VERB_EXECUTING, VERB_STARTING, VERB_STOPPING, wakelock, [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 하고 초기화시켜준다.




반응형

댓글