외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 30(잡 스케줄러) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 30(잡 스케줄러)

Nova_ 2023. 2. 23. 15:00

- 잡 스케줄러

잡 스케줄러는 앱실행시 구동되는 백그라운드가 아닌 특정 상황에서 실행되는 백그라운드입니다. 예를들어 네트워크가 와이파이일때, 배터리가 충전상태일때등등에만 실행되게끔 만들 수 있는게 잡 스케줄러입니다. 또한 실행주기도 정할 수 있어 일정 주기마다 실행되게끔 할 수 있습니다.

 

- 잡 스케줄러의 구성요소

잡 스케줄러의 구성요소는 아래와 같습니다.

  • 잡 서비스 : 백그라운드는 어떻게 돌아가는지 설정합니다.
  • 잡 인포 : 잡 스케줄러가 어떤 상황에서 돌아가는지 설정합니다.
  • 잡 스케줄러 :시스템에 잡스케줄러를 등록합니다.

- 잡 서비스

잡 서비스를 만드는 방법을 알아보겠습니다. 잡서비스는 개발자가 만드는 서비스이므로 매니페스트에 <service> 태그로 등록합니다. 또한 아래와 같이 퍼미션도 등록해줍니다.

        <service android:name=".MyJobService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE"></service>

그런다음 JobService를 상속받아 서비스의 생명주기에 따른 함수를 작성합니다. 아래는 MyJobService.kt 파일입니다.

class MyJobService: JobService() {
    override fun onCreate() {
        super.onCreate()
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onStartJob(params: JobParameters?): Boolean {
        return false
    }

    override fun onStopJob(params: JobParameters?): Boolean {
        return false
    }
}

새롭게 잡 스케줄러는 onStartJob() 함수와 onStopJob()함수가 생명주기 함수로 제공됩니다. 이때 이 두개 함수는 무조건 재정의를 해줘야합니다. onStartJob()함수는 서비스가 시작될때 콜백됩니다. 따라서 백그라운드에서 처리할 작ㅇ버을 구현합니다. 반환값은 boolean값인데 true인지 false인지에 따라서 잡스케줄러가 다르게 동작합니다.

  • false : 작업이 완벽하게 종료되었음을 의미합니다.
  • true : 작업이 아직 끝나지 않았음을 의미합니다.

onStopJob()함수는 서비스가 정상적인 종료상태에서는 호출되지 않고 갑자기 잡 스케줄러를 실행하는 조건이 변경되거나 어디선가 cancel()함수로 취소했을때 호출됩니다. 따라서 보통은 onStartJob()함수가 끝나면 onDestroy()함수가 실행됩니다.

 

- 잡 인포, 실행조건 정의

잡 서비스의 실행조건을 정의할때는 JobInfo 객체를 사용합니다. 무제한 네트워크에 연결되어있는 경우 즉, 와이파이에 연결되어있는경우에 실행되는 조건으로 JobInfo 객체를 설정해주겠습니다. 아래는 메인 액티비티.kt파일입니다.

val componentName = ComponentName(this, MyJobService::class.java) //컴포넌트 객체를 가져옵니다.
val builder = JobInfo.Builder(1, componentName) //컴포넌트를 JobInfo 객체에 넣어 builder로 만들어줍니다.
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) //builder에 와이파이 조건을 넣어줍니다.

JobInfo.Builder(1, componentName)에서 1은 컴포넌트 식별값으로 cancel(1)와 같이 컴포넌트를 제어할때 사용합니다. 조건을 명실할때는 다음과 같은 세터 함수등을 이용할 수 있습니다.

  • setPersisted(true) : 기기를 재부팅해도 작업 등록을 유지하는지 설정
  • setPeriodic(long intervalMillis) : 작업의 실행 주기를 설정
  • setMinimumLatency(long maxExecutionDelayMillis) : 작업의 실행 지연 시간을 설정
  • setOvrrideDeadline(long ...) : 다른 조건에 만족하지 않더라도 작업이 이 시간안에 실행되어야 함
  • setRequiredNetworkType(int networnType): 네트워크 타입 설정
  • setRequiredBatteryNoLow(boolean) : 베터리가 낮은 상태가 아닐때만 작업 등록 유지 여부
  • setRequiresCharging(boolean) : 베터리 충전상태일 때만 작업 등록 유지 여부

<데이터 전달>

잡 스케줄러 사용시 백그라운드에서 처리할때 데이터를 전달해야할때도 있습니다. 이때는 PersistableBundle 타입의 객체로 키-값 형태의 데이터를 담아서 setExtras()함수로 줍니다. 아래는 예시입니다. 메인 액티비티.kt 파일입니다.

val extras = PersistableBundle()
extras.putString("data1", "hello")
builder.setExtras(extras)

이렇게 전달한 값은 MyJobService 클래스에서 onStartJob함수에서 사용할 수 있습니다. 아래는 예시입니다. MyJobService.kt 파일입니다.

    override fun onStartJob(params: JobParameters?): Boolean {
        val data1 = params?.extras?.getString("data1")
        if (data1 != null) {
            Log.d("log", data1)
        }
        return false

 

- 잡스케줄, 시스템에게 등록

시스템 등록은 jobScheduler객체를 이용합니다. 아래는 예시입니다.

        var jobScheduler: JobScheduler? = getSystemService<JobScheduler>()
        val jobInfo = builder.build()
        
        jobScheduler!!.schedule(jobInfo)

 

이렇게 실행해보겠습니다.

와이파이가 연결되니 아래와 같이 로그가 나타납니다.

Comments