잡 스케줄러를 이용하여 백그라운드 처리를 할 수 있다.
모든 상황의 백그라운드 처리를 할 수 있는 것은 아님
잡 서비스
백그라운드에서 처리할 작업을 구현한 서비스이다.
잡 인포
잡 서비스 정보와 실행될 조건을 지정한다.
잡 스케줄러
잡 인포를 시스템에 등록한다.
// 잡 서비스 클래스 작성
class MyJobService : JobService() {
override fun onCreate() {
super.onCreate()
Log.d(TAG, "onCreate: ")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy: ")
}
override fun onStartJob(p0: JobParameters?): Boolean {
Log.d(TAG, "onStartJob: ")
return false
}
override fun onStopJob(p0: JobParameters?): Boolean {
Log.d(TAG, "onStopJob: ")
return false
}
}
onStartJob() 함수에는 백그라운드에서 처리할 작업을 구현한다.
반환 값에 따라서 다르게 동작한다.
false --> 작업이 완벽하게 종료되었음을 의미
true --> 작업이 아직 끝나지 않았음을 의미
override fun onStartJob(p0: JobParameters?): Boolean {
Log.d(TAG, "onStartJob: ")
Thread(Runnable {
var sum = 0
for (i in 1..10) {
sum += i
SystemClock.sleep(1000)
}
Log.d(TAG, "...onStartJob... thread reusult : $sum")
jobFinished(p0, false)
}).start()
return false
}
onStartJob함수를 위와 같이 작성한 경우 로그 출력은 아래와 같다.
이때도 onStopJob() 함수는 호출되지 않았다.
onStopJob() 함수는 갑자기 잡 스케줄러를 실행하는 조건이 변경되거나, 어디선가 cancel() 함수로 취소했을 경우 호출된다.
이러한 상황을 잡 스케줄러가 비정상으로 종료된 것으로 인지하고 서비스를 종료하기 전에 처리할 로직을 onStopJob()함수에서 실행한다.
잡 서비스의 실행 조건 정의이다.
var jobScheduler: JobScheduler? = getSystemService<JobScheduler>()
JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)).run {
setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
jobScheduler?.schedule(build())
}
잡 서비스를 잡 스케줄러를 이용해 시스템에 등록하면, 잡 서비스가 실행이 된다.
잡 서비스에 데이터를 전달하려면 setExtras() 함수를 이용한다.
class MainActivity : AppCompatActivity() {
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var jobScheduler: JobScheduler? = getSystemService<JobScheduler>()
val extras = PersistableBundle()
extras.putString("extra_data", "hello")
JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)).run {
setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
setRequiresCharging(true)
setExtras(extras)
jobScheduler?.schedule(build())
}
}
}
매개변수로 PersistableBundle 타입의 객체를 지정하였다.
override fun onStartJob(p0: JobParameters?): Boolean {
val d = p0?.extras?.getString("extra_data")
Log.d(TAG, "onStartJob: $d")
return false
}
onStartJob() 함수의 매개변수를 이용하여 전달한 테이터를 확인한다.