Android

JobScheduler로 백그라운드 작업 예약하기

까망사과 2022. 9. 5. 10:00

JobScheduler를 사용하면 특정 조건을 만족하는 때 백그라운드 작업을 수행하도록 예약할 수 있다.

 

API

JobScheduler

작업을 예약하는 시스템 서비스.

 

JobInfo

예약할 작업에 대한 정보를 포함하는 컨테이너. 작업이 실행되는 조건 등을 설정할 수 있다.

 

JobService

예약된 작업을 수행하는 서비스.

 


JobService

JobService는 서비스이므로 매니페스트에 <service>로 등록해야 한다. 또한 BIND_JOB_SERVICE 권한이 필요하다.

<manifest>
<application>
<service
android:name="MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE" >
...
</service>
...
</application>
...
</manifest>

그리고 JobService를 상속받는 클래스를 선언한다.

 

JobService는 다음 두 콜백 메서드를 재정의해야 한다.

  • onStartJob(params: JobParameters!): Boolean
    작업을 실행할 때 호출된다. 예약된 작업을 수행하는 로직을 여기에 작성한다. 이 메서드는 앱의 메인 스레드에서 실행되므로 필요한 경우 별도로 스레드를 생성하여 작업을 수행해야 한다. 작업을 완료했다면 jobFinished()에 파라미터를 전달하여 시스템에게 알려야 한다.
    파라미터 타입 설명
    params JobParameters! 수행할 작업에 대한 정보.
    반환값 타입 설명
    Boolean 메서드를 실행한 뒤에도 작업을 계속 수행해야 하면 true를 반환한다. 이 경우 필요하다면 별도 스레드에서 작업을 수행하며, 작업을 완료하면 jobFinished()을 호출하여 시스템에 알려야 한다. 반면 메서드가 실행되는 동안 작업을 완료했다면 false를 반환한다.
  • onStopJob(params: JobParameters!): Boolean
    정상적으로 작업을 종료할 때 호출되는 것이 아니라 시스템이 작업을 중단해야 한다고 판단했을 때 호출된다. 작업을 수행하던 도중 실행 조건을 만족할 수 없게 되는 경우(ex: 충전 중인 상태에서 수행해야 하는 작업 도중 충전이 해제됨) 이 메서드가 호출될 수 있다. 이 경우 jobFinished()를 호출하지 않아도 된다.
    파라미터 타입 설명
    params JobParameters! 수행할 작업에 대한 정보. JobParameters.getStopReason()을 사용하여 작업이 중단된 이유를 확인할 수 있다.
    반환값 타입 설명
    Boolean 작업을 다시 예약하려면 true, 그러지 않고 작업을 그대로 완전히 종료하려면 false를 반환한다.

 

작업을 완료했다고 시스템에 알리려면 JobService.jobFinished()를 호출해야 한다.

  • jobFinished(params: JobParameters!, wantsReschedule: Boolean): Unit
    JobScheduler에게 작업을 완료했음을 알리는 메서드. 작업이 비정상적으로 중단됐을 때 호출되는 onStopJob()에서는 호출하지 않아도 된다.
    파라미터 타입 설명
    params JobParameters! 완료한 작업에 대한 정보.
    wantsReschedule Boolean 작업을 다시 예약하려면 true를 반환한다. 이때 작업의 실행 조건으로는 처음 예약할 당시 설정해둔 백오프 조건(JobInfo.Builder.setBackoffCriteria()로 설정)이 적용된다.

 


JobInfo

JobInfoJobScheduler에 예약할 작업에 대한 정보를 포함하는 컨테이너 역할을 한다.

 

JobInfo 객체는 Builder 클래스를 통해 생성한다.

  • JobInfo.Builder(jobId: Int, jobService: ComponentName)
    파라미터 타입 설명
    jobId Int 작업을 식별하는 ID값.
    jobService ComponentName 해당 작업을 수행할 JobService.

 

빌더 클래스의 세터를 사용하여 다음과 같은 작업 수행 조건 및 추가 데이터를 포함하는 번들을 설정할 수 있다.

  • 모니터링할 컨텐츠 URI
  • 백오프 조건
  • 최소 지연 시간
  • 작업 실행 주기
  • 디바이스 재부팅 시 현재 조건 유지 여부
  • 네트워크 요구 여부 및 네트워크 유형
  • 배터리 충전 상태

 


JobScheduler

JobScheduler는 앱 프로세스에 작업을 예약하는 시스템 서비스이므로 다음처럼 Context.getSystemService()를 통해 불러온다.

val scheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler

 

JobScheduler는 다음 메서드를 통해 작업을 예약 및 관리할 수 있다.

  • schedule(job: JobInfo): Int
    작업을 예약하도록 요청한다. 해당 작업이 이미 실행 중이라면 중지된다. 반환값은 예약 요청 결과를 나타낸다.
  • enqueue(job: JobInfo, work: JobWorkItem): Int
    schedule()과 유사하게 작업을 예약할 때 사용한다. 해당 작업이 이미 예약되어 있다면 새 것으로 교체되며, 이미 실행 중이라면 해당 작업을 중지하지 않고 새 작업을 예약한다. 반환값은 예약 요청 결과를 나타낸다.
  • getPendingJob(jobId: Int): JobInfo?
    전달하는 ID에 해당하는 작업 정보를 반환한다.
  • getAllPendingJobs(): MutableList<JobInfo>!
    예약된 작업 목록을 반환한다.
  • cancel(jobId: Int): Unit
    작업을 취소한다.
  • cancelAll(): Unit
    예약된 모든 작업을 취소한다.