本篇主要探究 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。