eijenson Con

主に作業中にはまったことの作業ログを書いていきます。

JobSchedulerで◯時間後からXX時間ごとに定期実行する方法

概要

Android Oreo対応の時に、定期実行処理をJobSchedulerに設定したら1回目が即時実行されて困ったので対応した。

コード

アプリ起動のActivity

class MainActivity : AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        // 略
        startJob()
    }

    override fun startJob() {
        val componentName = ComponentName(this, FirstRunJobService::class.java)

        val periodic = 15 * 60 * 1000L // 15分
        val scheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
        val jobInfo = JobInfo.Builder(1, componentName)
                .setMinimumLatency(periodic) // サービス起動遅延時間を設定する
                .build()

        scheduler.schedule(jobInfo)
    }
}

Activityから起動するService

class FirstRunJobService : JobService() {
    override fun onStartJob(p0: JobParameters?): Boolean {
        startJob()
        return false
    }

    override fun onStopJob(p0: JobParameters?): Boolean {
        return false
    }

    private fun startJob() {
        val componentName = ComponentName(this, MyJobService::class.java)

        // デバッグ時は15分,リリース版は6時間ごと
        val periodic = if (BuildConfig.DEBUG) 15 * 60 * 1000L else 6 * 60 * 60 * 1000L
        val scheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
        val jobInfo = JobInfo.Builder(2, componentName)
                .setPeriodic(periodic) // サービス実行間隔を設定する
                .build()

        scheduler.schedule(jobInfo)
    }
}

定期実行するService

class MyJobService : JobService() {

    override fun onStartJob(p0: JobParameters?): Boolean {
        // 定期実行したい処理
        return true
    }

    override fun onStopJob(p0: JobParameters?): Boolean {
        return true
    }
}

説明

ActivityでFirstRunJobServiceを15分後に起動するように処理を書く。 setMinimumLatencyメソッドで遅延時間を設定する(コードでは15分後に実行する)

FirstRunJobServiceでは、MyJobServiceを起動するための設定だけを行なっている setPeriodicメソッドで実行間隔を設定する(コードでは15分か6時間後に実行する)

setMinimumLatencyとsetPeriodicは同時には設定できない(例外が吐かれる)

参考URL

公式のリファレンス

https://developer.android.com/reference/android/app/job/JobInfo.Builder