Job Service

James Lin
5 min readApr 10, 2019

--

本篇主要探究 Job Service 的功能以及生命週期。

Job Service 是在 Android 5.0 加入的元件,在 Android 8.0 之後,就禁止在後台(Background)使用 一般的 Service,但是可以使用 Job Service。

如何使用 Job Service

首先要先在 AndroidManifest 宣告權限

<application
...>
<service
android:name=".MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
>
</service>
...
</application>

接著 Create 一個 Service

class MyJobService : JobService {

constructor(){

}

override fun onStartJob(params: JobParameters): Boolean {
....
}

override fun onStopJob(params: JobParameters): Boolean {
...
}
override fun onDestroy() {
super.onDestroy()
}
}

先取得系統的 Scheduler。

getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

接著指派要執行 Task 的 Service

val builder = JobInfo.Builder(1, ComponentName(this, MyJobService::class.java))  //assign service

設定在什麼條件下要叫 Service 執行此 Task。

MinimumLatency:此任務最少要多久後才會被執行,這裡設定是最少 5 秒後執行 Task。

builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(5000))

如果需要傳值可以使用 PersistableBundle 來傳送資料,並在 builder 中設定。

var bundle = PersistableBundle()
bundle.putString("data", "James task1")
builder.setExtras(bundle)

最後加入系統的 schedule

jobScheduler.schedule(builder.build())

完整 code

fun doJob() {
var bundle = PersistableBundle()
bundle.putString("data", "James task1")
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val builder = JobInfo.Builder(1, ComponentName(this, MyJobService::class.java)) //assign service
builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(5000)) // delay start time
builder.setExtras(bundle)
jobScheduler.schedule(builder.build())

}

Job Service 方法的回傳值

start 兩個 task,在 onStartJob 回傳 true,必須要兩個 task 都被 cancel 或者 finish 之後才會執行 onDestroy。
True:代表跟系統說有 Task 要被執行。
False:跟系統說無 Task 要被執行,接著會直接執行到 onDestroy。

finish 的程式碼

this.jobFinished(params, false)

start 兩個 task,在 onStartJob 回傳 false,會直接執行到 onDestroy,但開出去的 Thread 還是會繼續執行,而且使用 cancel 並不會執行 onStopJob。

onStopJob 的回傳值
true:跟系統說如果 Task 因為 wifi 斷掉之類的原因導致 Task 失敗,當 Task 的條件再次成立時,會再執行此 Task。
false:則表示此 Task 已完成。
如果是使用 cancel 而呼叫到此方法的狀況,則回傳 true 或 false 皆不會再執行此 Task。

GitHub

--

--

James Lin
James Lin

No responses yet