훌륭한 개발자가 되기 위하여
[Android | Kotlin] 잡 스케줄러 본문
잡 스케줄러의 실행조건
- 잡 스케줄러에 조건으로 명시할 수 있는 상황
- 네트워크 타입
- 배터리 충전 상태
- 특정 앱의 콘텐츠 프로바이더 갱신 (대표적으로 갤러리 앱)
- 실행 주기
- 최소 지연 시간
- 시스템 재구동 시 현재 조건 유지 여부
잡 스케줄러의 3가지 구성 요소
- 잡 서비스 : 백그라운드에서 처리할 작업을 구현한 서비스
- 잡 인포 : 잡 서비스 정보와 실행될 조건을 지정합니다.
- 잡 스케줄러 : 잡 인포를 시스템에 등록합니다.
잡 서비스 - 백그라운드 작업 구현
- 잡 서비스는 개발자가 만드는 서비스이므로 매니페스트에 <service> 태그로 등록
- android.permission.BIND_JOB_SERVICE 퍼미션도 포함
<service
android:name=".MyJobService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE">
</service>
- JobService를 상속받아 작성
- onStartJob( ), onStopJob( ) 함수는 반드시 재정의
- onStartJob( ) 함수에는 백그라운드에서 처리할 작업을 구현
- 함수의 반환값은 Boolean 타입인데 true인지 false 인지에 따라서 다르게 동작
- false : 작업이 완벽하게 종료되었음을 의미 → 시스템은 더 처리할 필요가 없다고 판단하여 onStopJob( ) 함수를 건너뛰고 바로 onDestroy( ) 함수를 호출해 서비스를 종료합니다.
- true : 작업이 아직 끝나지 않았음을 의미
// 잡 서비스 클래스 작성
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
class MyJobService : JobService() {
override fun onCreate() {
super.onCreate()
Log.d("kim", "MyJobService......onCreate()")
}
override fun onDestroy() {
super.onDestroy()
Log.d("kim", "MyJobService......onDestroy()")
}
override fun onStartJob(params: JobParameters?): Boolean {
Log.d("kim", "MyJobService......onStartJob()")
return false
}
override fun onStopJob(params: JobParameters?): Boolean {
Log.d("kim", "MyJobService......onStopJob()")
return true
}
}
- onStopJob( ) 함수의 반환값도 Boolean 타입인데 true, false에 따라 다르게 동작합니다.
- onStopJob( ) 함수는 작업이 정상으로 처리되지 않았을 때 호출됩니다.
- false : 잡 스케줄러 등록을 취소합니다.
- true : 잡 스케줄러를 재등록합니다.
잡 인포 - 잡 서비스의 실행 조건 정의
- JobInfo.Builder에 지정한 잡 서비스가 실행되는 조건을 명시
- JobInfo.Builder의 첫 번째 매개변수는 등록할 작업의 식별값, 두 번째 매개변수는 등록할 잡 서비스입니다.
- setPersisted(true) : 기기를 재부팅해도 작업 등록을 유지해야 하는지를 설정합니다.
- setPeriodic(long intervalMillis) : 작업의 실행 주기를 설정합니다.
- setMinimumLatency(long minLatencyMillis) : 작업의 실행 지연 시간을 설정합니다.
- setOverrideDeadline(long maxExecutionDelayMillis) : 다른 조건에 만족하지 않더라도 작업이 이 시간 안에 실행되어야 함을 설정합니다.
- setRequiredNetworkType(int networkType) : 네트워크 타입을 설정합니다.
- setRequiresBatteryNotLow(boolean batteryNotLow) : 배터리가 낮은 상태가 아님을 설정합니다.
- setRequiresCharging(boolean requiresCharging) : 배터리가 충전 상태인지를 설정합니다.
// 잡 서비스의 실행 조건 정의
var jobScheduler: JobScheduler? = getSystemService<JobScheduler>()
JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)).run {
setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
jobScheduler?.schedule(build())
}
잡 스케줄러 - 잡 서비스 등록 시 데이터 전달
- 잡 서비스를 JobInfo 객체를 이용해 시스템에 등록하면 조건에 만족할 때 실행
- 잡 서비스에 데이터를 전달하려면 JobInfo.Builder의 setExtras( ) 함수를 이용
// 잡 서비스에 데이터 전달
var jobScheduler: JobScheduler? = getSystemService<JobScheduler>()
val extras = PersistableBundle()
extras.putString("extra_data", "hello kim")
val builder = JobInfo.Builder(1, componentName)
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
builder.setRequiresCharging(true)
builder.setExtras(extras)
val jobInfo = builder.build()
jobScheduler!!.schedule(jobInfo)
- 전달한 데이터를 잡 서비스에서 가져올 때는 onStartJob( ) 함수의 매개변수를 이용
// 잡 서비스에서 데이터 가져오기
override fun onStartJob(jobParameters: JobParameters): Boolean {
jobParameters.extras.getString("extra_data")
// (... 생략 ...)
return false
}
'안드로이드' 카테고리의 다른 글
[Android | Kotlin] 안드로이드 기본 앱과 연동하기 (1) | 2024.01.03 |
---|---|
[Android | Kotlin] 콘텐츠 프로바이더 이해하기 (0) | 2024.01.03 |
[Android | Kotlin] 백그라운드 제약 (0) | 2023.12.31 |
[Android | Kotlin] 바인딩 서비스 (0) | 2023.12.29 |
[Android | Kotlin] 서비스 이해하기 (0) | 2023.12.29 |