https://codechacha.com/ko/android-jobscheduler-and-jobservice/
https://developer.android.com/reference/android/app/job/JobScheduler
BroadCastReceiver의 OnReceive메소드에서 볼륨이 큰 작업을 할 경우 안드로이드 시스템에 의해 프로세스가 종료될 위험이있습니다.
참조 https://developer.android.com/guide/components/broadcasts?hl=ko#effects-process-state
따라서 Android 가이드에서는 goAsync 혹은 JobScheduler를 사용하도록 가이드 하고있습니다.
goAsync
검색결과 goAsync를 사용하는 방법은 ANR을 5초에서 10초 정도로 늘려주는 역할밖에 안된다고하여 스킵합니다.
JobScheduler
JobService
class MyJobService : JobService(){
override fun onStartJob(params: JobParameters?): Boolean {
Log.d(LOG_TAG, "MyJob ${params?.jobId} start")
Thread {
//do what you want
jobFinished(params, false)
}
return true
}
override fun onStopJob(params: JobParameters?): Boolean {
Log.d(LOG_TAG, "MyJob ${params?.jobId} Stop")
return false
}
}
manifest
<service
android:name=".wear.FeatureExchangeReceiver$MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
BroadcastReceiver
override fun onReceive(context: Context, intent: Intent) {
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val serviceComponent = ComponentName(context, MyJobService::class.java)
val jobID = 1
val jobInfo = JobInfo.Builder(jobID, serviceComponent)
.setOverrideDeadline(TimeUnit.MINUTES.toMillis(1))
.build()
jobScheduler.schedule(jobInfo)
}
기본적으로 이정도만 구현해주면 동작을 한다.
manifest
service를 사용하기위해 manifest에 등록해줘야 댐
onReceiver내에서 Jobschduler등록
builder를 통해 JobInfo를 생성해 줄수있다.
JobInfo에서 옵션을 통해 언제 JobService를 실행할지를 설정해 줄수있음.
builder에서 설정해줄수있는 옵션 목록은 아래를 참조.
https://developer.android.com/reference/android/app/job/JobInfo.Builder#setMinimumLatency(long)