BroadCastReceiver에서 오래걸리는 작업을 해야하는경우

cluelin·2022년 2월 4일
0

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를 사용하도록 가이드 하고있습니다.

  1. goAsync
    검색결과 goAsync를 사용하는 방법은 ANR을 5초에서 10초 정도로 늘려주는 역할밖에 안된다고하여 스킵합니다.

  2. 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)
        }

기본적으로 이정도만 구현해주면 동작을 한다.

  1. JobService
    JobInfo에서 설정해준 조건에 따라 onStartJob , onStopJob이 호출된다.
    onStartJob에서의 return값은 서비스가 현재 실행중인지 여부를 알려준다.
    만약 return 값이 true라면 다른 쓰레드에서 현재 동작중이라는 의미이고, 이경우에는 Thread내에서 작업종료후 반드시 false를 return해줘야한다.
  1. manifest
    service를 사용하기위해 manifest에 등록해줘야 댐

  2. onReceiver내에서 Jobschduler등록
    builder를 통해 JobInfo를 생성해 줄수있다.
    JobInfo에서 옵션을 통해 언제 JobService를 실행할지를 설정해 줄수있음.
    builder에서 설정해줄수있는 옵션 목록은 아래를 참조.

    https://developer.android.com/reference/android/app/job/JobInfo.Builder#setMinimumLatency(long)

0개의 댓글