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
JobInfo
는 JobScheduler
에 예약할 작업에 대한 정보를 포함하는 컨테이너 역할을 한다.
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
예약된 모든 작업을 취소한다.
'Android' 카테고리의 다른 글
데이터 바인딩 (1) : 기본 사용법 (0) | 2022.10.29 |
---|---|
컨텐츠 프로바이더 (0) | 2022.09.19 |
서비스 (3) : 시작되는 서비스 (0) | 2022.08.29 |
서비스 (2) : 바인딩된 서비스 (0) | 2022.08.28 |
서비스 (1) : 포그라운드 및 백그라운드 서비스 (0) | 2022.08.27 |