<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() 는 결과에 따라 다르게 동작한다.
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() 의 결과
var jobScheduler : JobScheduler? = getSystemService<JobScheduler>()
JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)).run{
setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // 네트워크 타입 명시
jobScheduler?.schedule(build())
}
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)
override fun onStartJob(p0: JobParameters?): Boolean {
p0?.extras?.getString("extra_data")
return true
}