https://medium.com/huawei-developers/jobscheduler-in-android-3b269e3a4e49
JobScheduler in Android
JobScheduler is a system service that allows you to schedule tasks or jobs to be executed in the background.
medium.com
JobScheduler
- 백그라운드에서 실행될 작업을 예약할 수 있는 시스템 서비스
- 유사한 작업을 그룹화하고 함께 실행하여 시스템 리소스와 배터리 수명을 관리하도록 설계되었다.
- 즉각적인 사용자 상호작용이 필요하지 않고 더 적절한 시간으로 연기할 수 있는 작업을 수행하는 데 유용하다.
- 주요 구성 요소
- JobScheduler : 작업을 예약하고 관리하기 위해 상호작용하는 시스템 서비스
- JobInfo : JobScheduler 가 작업 실행 시기를 결정하는 데 사용할 기준 집합을 나타낸다. 네트워크 상태, 충전 상태 등이 포함된다.
- JobService : 예약된 작업을 처리하기 위해 확장하는 서비스 클래스
JobScheduler 가 필요한 이유
- 배터리 최적화 : Android 기기는 배터리 수명을 최적화하도록 설계되었다. JobScheduler 를 사용하면 시스템이 유사한 작업을 함께 묶어 처리할 수 있으므로, 작업을 개별적으로 실행하는 것보다 배터리 수명에 미치는 전반적인 영향을 줄일 수 있다.
- 네트워크 제약 : 네트워크 연결 등의 요인에 따라 작업 실행 시점에 제약 조건을 설정할 수 있다. 예를 들어, 기기가 Wi-Fi 에 연결되었을 때만 데이터를 다운로드하도록 작업을 예약할 수 있다.
- 충전 상태 : 작업이 장치가 플러그인된 경우에만 실행되도록 지정할 수 있다. 이는 리소스를 많이 사용하는 작업에 유용하다.
- 유휴 상태 : 기기가 유휴 상태일 때 작업이 실행되도록 예약할 수 있다. 이 기능은 특히 시간에 크게 구애받지 않고 기기를 사용하지 않을 때까지 연기할 수 있는 작업을 수행할 때 유용하다.
- 유사한 작업 그룹화 : JobScheduler 는 유사한 작업을 함께 그룹화하여 시스템 리소스를 보다 효율적으로 사용하고 성능을 향상시킬 수 있다.
- Doze 모드 호환성 : Android 의 Doze 모드와 호환되므로 기기가 저전력 상태에 있을 때도 작업을 예약할 수 있다.
- 사용자 기본 설정 존중 : 백그라운드 작업에 대한 사용자 기본 설정과 시스템 정책을 존중하여 보다 사용자 친화적인 환경을 만드는 데 도움이 된다.
- 웨이크 잠금 방지 : 기기를 계속 깨어 있는 상태로 유지하는 기존 서비스와 달리 JobScheduler 로 예약된 작업을 사용하면 기기를 사용하지 않을 때 저전력 상태로 돌아가서 배터리 수명을 절약할 수 있다.
- 자동 재시도 및 백오프 정책 : JobScheduler 는 실패한 작업에 대한 자동 재시도 및 백오프 정책을 처리하여 수동 오류 처리의 필요성을 줄인다.
- 유연한 간격 지원 : 작업 실행 가능 시간을 유연하게 지정할 수 있다. 이는 시간에 구애받지 않고 특정 시간 내에 완료할 수 있는 작업에 유용하다.
JobScheduler로 백그라운드 작업 예약하기
JobScheduler를 사용하면 특정 조건을 만족하는 때 백그라운드 작업을 수행하도록 예약할 수 있다. API JobScheduler 작업을 예약하는 시스템 서비스. JobInfo 예약할 작업에 대한 정보를 포함하는 컨테이
blk-sg.tistory.com
JobService 콜백 메서드
1. onStartJob(params: JobParameters!): Boolean
- 작업을 실행할 때 호출된다.
- 예약된 작업을 수행하는 로직을 여기에 작성한다.
- 앱의 메인 스레드에서 실행되므로 필요한 경우, 별도로 스레드를 생성하여 작업을 수행해야 한다.
- 작업을 완료했다면 jobFinished()에 파라미터를 전달하여 시스템에게 알려야 한다.
- params : 수행할 작업에 대한 정보
- 반환값 Boolean : 메서드를 실행 뒤에도 작업을 계속 수행해야 하면 true 를 반환한다. 이 경우 필요하다면 별도 스레드에서 작업을 수행하며, 작업을 완료하면 jobFinished()을 호출하여 시스템에 알려야 한다. 반면, 메서드가 실행되는 동안 작업을 완료했다면 false 를 반환한다.
2. onStopJob(params: JobParameters!): Boolean
- 정상적으로 작업을 종료할 떄 호출되는 것이 아니라 시스템이 작업을 중단해야 한다고 판단했을 때 호출된다.
- 작업을 수행하던 도중, 실행 조건을 만족할 수 없게 되는 경우(Ex. 충전 중인 상태에서 수행해야 하는 작업 도중 충전이 해제됨) 이 메서드가 호출될 수 있다.
- jobFinished()를 호출하지 않아도 된다.
- params : 수행할 작업에 대한 정보. JobParameters.getStopReason()을 사용하여 작업이 중단된 이유를 확인할 수 있다.
- 반환값 Boolean : 작업을 다시 예약하려면 true, 그러지 않고 작업을 그대로 완전히 종료하려면 false 를 반환한다.
JobService.jobFinished(params)
- jobFinished(params: JobParameters!, wantsReschedule: Boolean): Unit
- JobScheduler 에게 작업을 완료했음을 알리는 메서드
- 작업이 비정상적으로 중단됐을 때 호출되는 onStopJob()에서는 호출하지 않아도 된다.
- params : 완료한 작업에 대한 정보
- wantsReschedule : 작업을 다시 예약하려면 true 를 반환한다. 이때 작업의 실행 조건으로는 처음 예약할 당시 설정해둔 백오프 조건(JobInfo.Builder.setBackoffCriteria()로 설정)이 적용된다.
JobInfo
- JobInfo.Builder(jobId: Int, jobService: ComponentName)
- jobId : 작업을 식별하는 ID 값
- jobService : 해당 작업을 수행할 JobService
JobScheduler
- 앱 프로세스에 작업을 예약하는 시스템 서비스이므로 Context.getSystemService()를 통해 불러온다.
- 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
- 예약된 모든 작업을 최소한다.
https://medium.com/@vishalpvijayan4/job-scheduler-or-work-manager-07109b354550
Job Scheduler OR Work Manager
1. JobScheduler:
medium.com
JobScheduler
- 목적 : 다양한 유형의 작업이 특정 간격으로 또는 특정 조건에서 실행되도록 예약할 수 있는 서비스이다.
- 사용 사례 : 백그라운드 동기화, 주기적 업데이트 등 즉각적으로 실행할 필요가 없고 연기할 수 있는 작업에 적합하다.
- 메모리 관리 : JobScheduler 로 예약된 작업은 시스템에서 관리하며, 시스템은 메모리 제약을 처리하여 리소스가 사용 가능할 때 작업이 실행되도록 보장한다.
- 작업이 지연될 수 있지만 시간이 중요하지 않고 시스템 수준의 최적화를 활용하려는 경우 사용한다. 예를 들어, 정기적인 날씨 업데이트가 가능하다.
- 작업은 시스템에 의해 관리된다. 시스템은 메모리 제약 조건을 처리하고 리소스가 사용 가능할 때 작업이 실행되도록 보장한다. 그러나 프로세스 종료와 같은 상황에서는 작업 실행을 보장하지 못할 수 있다.
WorkManager
- 작업이 중요하고 안정적으로 실행되어야 하며, 실행 보장, 제약 조건 지원, 다양한 Android 버전 간 호환성과 같은 추가 기능이 필요할 때 사용한다.
- 메모리를 효율적으로 관리하도록 설계되었다. 프로세스가 종료되더라도 작업을 유지하고 일정을 재조정하여 백그라운드 작업에 대한 더욱 안정적인 솔루션을 제공한다.
https://codechacha.com/ko/android-jetpack-workmanager/
https://codechacha.com/ko/android-jetpack-workmanager/
codechachaCopyright ©2019 codechacha
codechacha.com
WorkManager
- background task 구현, 스케쥴 등을 쉽게 처리할 수 있도록 만든 기능
- 내부적으로 JobScheduler 를 사용하며(API 23 이상) JobScheduler 를 지원하지 않는 단말(API 14~22)은 AlarmManager 또는 BroadcastReceiver 를 사용하도록 구현되었다.
- Job 스케쥴링 : Job 을 스케쥴링할 수 있다.
- Job 의 상태 모니터링 : 실시간으로 처리되는지 상태를 알 수 있다.
- Constraint(제약) : 원하는 조건에 Job 이 동작하도록 제약을 줄 수 있다.
- Chaning Task : 여러 Job 을 정한 순서대로 실행되도록 할 수 있다.
WorkManager 주요 클래스
- Worker : 백그라운드에서 수행될 태스크를 의미한다. 추상 클래스인 Worker 를 상속한 클래스를 구현하고 동작할 태스크를 구현해야 한다.
- doWork()를 오버라이드하여 이곳에 할 일을 구현한다.
- WorkRequest : WorkManager 에 수행할 태스크를 요청할 때 사용되는 클래스이다. 수행할 Worker 를 등록해야 하고, 한번만 실행할 것인지 주기적으로 실행할 것인지 설정할 수 있다.
- WorkManager : 이 객체에 WorkRequest 들이 추가되며, 설정에 맞게 태스크를 동작시킨다.
- WorkInfo 를 LiveData 로 제공하기 때문에 옵저버를 붙여 상태를 감시할 수 있다.
- 개별 태스크를 실행할 수도 있고, 여러 개의 태스크를 순차적으로(Chain) 실행할 수 있다.
- 태스크 A 의 결과를 입력값으로 태스크 B 를 실행하도록 처리할 수 있다.
- 태스크가 실행되는 주기와 조건도(constraint) 설정할 수 있다.
- WorkInfo : WorkManager 에 추가된 태스크들의 상태를 나타내는 클래스이다. Enqueue, Running, Success, Fail 등의 태스크의 현재 상태를 알 수 있다.
- Requset : WorkManager 에 할 일을 요청하는 기본 객체이다.
- Requset 에는 실행할 Worker 의 정보가 있고, 언제, 어떻게 태스크가 실행되어야 하는지 등의 정보가 있다.
- 한번만 실행해야 하는 태스크는 OneTimeWorkRequest.Builder 를 통해 Request 객체를 만들 수 있다.
- 죽지거으로 실행되는 태스크는 PeriodicWorkRequest.Builder 로 Request 객체를 만들 수 있다.
- 얼마 간격으로 태스크가 실행되어야 하는지 interval 시간을 입력해야 한다.
'안드로이드 > Android' 카테고리의 다른 글
[Android] Service (0) | 2025.04.27 |
---|---|
[Android] MVI (0) | 2025.01.26 |
[Android] Clean Architecture (0) | 2025.01.22 |