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