잡 스케줄러

k_hyun·2023년 3월 15일
0

잡 스케줄러를 이용하여 백그라운드 처리를 할 수 있다.
모든 상황의 백그라운드 처리를 할 수 있는 것은 아님

3가지 구성 요소

  • 잡 서비스
    백그라운드에서 처리할 작업을 구현한 서비스이다.

  • 잡 인포
    잡 서비스 정보와 실행될 조건을 지정한다.

  • 잡 스케줄러
    잡 인포를 시스템에 등록한다.

잡 서비스

// 잡 서비스 클래스 작성
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() 함수의 매개변수를 이용하여 전달한 테이터를 확인한다.

0개의 댓글