Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

훌륭한 개발자가 되기 위하여

[Android | Kotlin] 잡 스케줄러 본문

안드로이드

[Android | Kotlin] 잡 스케줄러

jay20033 2023. 12. 31. 18:00

잡 스케줄러의 실행조건

  • 잡 스케줄러에 조건으로 명시할 수 있는 상황
  • 네트워크 타입
  • 배터리 충전 상태
  • 특정 앱의 콘텐츠 프로바이더 갱신 (대표적으로 갤러리 앱)
  • 실행 주기
  • 최소 지연 시간
  • 시스템 재구동 시 현재 조건 유지 여부

잡 스케줄러의 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
}