15-4 잡 스케줄러

StrayCat·2022년 12월 10일
0
  • 앱이 백그라운드 상태일 때 작업 처리에 제약이 있지만, 잡 스케줄러를 통해 이를 보완할 수 있다.
  • 잡 스케줄러도 개발자가 만드는 서비스이므로 어떤 상황에서 실행해야하는지 조건을 명시해 줘야 한다.

잡 스케줄러의 실행 조건

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

잡 스케줄러의 3가지 구성 요소

  • 잡 서비스 : 백그라운드에서 처리할 작업을 구현한 서비스
  • 잡 인포 : 잡 서비스 정보와 실행될 조건을 지정
  • 잡 스케줄러 : 잡 인포를 시스템에 등록

잡 서비스 - 백그라운드 작업 구현

        <service
            android:name=".MyJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:enabled="true"
            android:exported="true">
        </service>
class MyJobService : JobService() {

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

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


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

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

}
  • JobService()를 상속받아 onStartJob, onStopJob을 구현한다.

  • onStartJob() 는 결과에 따라 다르게 동작한다.

    • return true : 작업이 아직 끝나지 않음
    • return false : 작업이 완전히 종료됨
  • onStartJob() 이 false를 반환하면 백그라운드 작업이 완전히 끝났다 판단하여 onStopJob()을 건너뛰고 onDestroy() 함수를 호출한다.

  • onStartJob() 이 true를 반환하면 아직 작업이 끝나지 않으므로 이후에 jobFinish() 함수를 호출한다.

  • 아래는 10초 정도 걸리는 작업을 실행한 예이다.

    override fun onStartJob(p0: JobParameters?): Boolean {
        Thread(
            Runnable { 
                var sum = 0
                for (i in 1..10){
                    sum += i
                    SystemClock.sleep(1000)
                }
                jobFinished(p0, false)
            }
            
        ).start()
        
        return true
    }
  • onStopJob() 함수의 경우, 작업을 하는 동안 잡 스케줄러의 조건이 변경되거나 다른곳에서 cancel() 등으로 비정상 종료되었을 때, 후처리를 하기 위해서 onStopJob()을 호출한다.

  • onStopJob() 의 결과

    • return true : 잡 스케줄러 재등록
    • return false : 잡 스케줄러 등록 취소

잡 인포

  • 잡 스케줄러의 실행 조건을 JobInfo 객체에 담는다.
        var jobScheduler : JobScheduler? = getSystemService<JobScheduler>()

        JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)).run{
            setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // 네트워크 타입 명시
            jobScheduler?.schedule(build())
        }
  • JobInfo.Builder 의 첫번째 매개변수는 등록할 작업의 식별값이다. cancel() 함수로 작업을 취소할 때 해당 값을 사용한다.
  • 두번째 매개변수는 등록할 잡 서비스를 나타낸다.
  • 이후 setter 함수를 통해 필요한 조건을 명시하여 등록한다.
    • setPersisted
    • setPeriodic
    • setMinimumLatency
    • setOverrideDeadline
    • setRequiredNetworkType
    • setRequiresBatteryNotLow
    • setRequiresCharging

잡 스케줄러

  • 잡 서비스에 데이터를 전달하려면 JobInfo.Builder 의 setExtras() 함수를 사용한다.
        var jobScheduler : JobScheduler? = getSystemService<JobScheduler>()
        val extras = PersistableBundle()
        extras.putString("extra_data", "hello")
        val builder = JobInfo.Builder(1, ComponentName(this, MyJobService::class.java))
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
        builder.setRequiresCharging(true)
        builder.setExtras(extras)

        val jobInfo = builder.build()
        jobScheduler!!.schedule(jobInfo)
  • 이렇게 전달한 데이터를 잡 서비스에서 가져올 때는 onStartJob() 의 매개변수를 사용한다.
    override fun onStartJob(p0: JobParameters?): Boolean {
        p0?.extras?.getString("extra_data")
        return true
    }

0개의 댓글