WorkManager (一) 介紹與基本使用
來源: Android Jetpack WorkManager | Android 中文教学视频
Android 要執行背景任務時有很多選擇,每種選擇都各有優缺點、特性和限制,特別是對於 API 版本的兼容性,讓開發者必須在程式裡寫冗長的判斷式,再換成不同的執行方法...
這時候就很推薦使用 Google 推出的新元件 WorkManager
。
WorkManager
支持 API 14 或以上的版本(使用率超過99%),且能夠根據版本的不同,智慧的選擇使用 JobSchedule
或是 AlarmManager
來操作後台任務,省去了寫一堆判斷 api 版本的麻煩。
管理和調度可延遲的,且必須要被執行的任務。
例如
向伺服器發送數據分析資料,不需要馬上執行,但又必須保證在未來某個時間點完成這項任務。
WorkManager
幾個比較重要的類別
Worker
任務的執行者,在 doWork
裡面完成要執行的任務並回傳執行結果
WorkRequest
指定 Worker 執行任務,並設定執行的環境,執行的順序等,
並使用它的子類 OneTimeWorkRequest
或 PeriodicWorkRequest
來決定要讓這個任務執行一次或多次。
WorkManager
管理任務請求和任務本身,並且為發起的 WorkRequest
設定排程和進入執行隊列的時機。
WorkStatus
任務的狀態和任務的信息,以 LiveData
的形式提供給觀察者。
添加依賴
dependencies {
implementation "androidx.work:work-runtime-ktx:2.2.0"
}
定義 Worker 類別,在 doWork()
裡執行任務
class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
Log.d("doWork", " inputData " + inputData.getString("InputDataKey"))
val outputData = workDataOf("OutputDataKey" to "OutputDataValue")
return Result.success(outputData)
}
}
inputData
當作 Bundle 來使用就可以了,並用 Key-Value 的形式來獲取數據。
回傳的 outputData
一樣是用 Key-Value 的形式來傳遞數據,但塞在 Result 裡的參數必須透過 fun workDataOf
轉換成 Data 型態
@SuppressLint("RestrictedApi")
fun workDataOf(vararg pairs: Pair<String, Any?>): Data {
val dataBuilder = Data.Builder()
for (pair in pairs) {
dataBuilder.put(pair.first, pair.second)
}
return dataBuilder.build()
}
定義 WorkRequest
val request = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
加入任務隊列
WorkManager.getInstance().enqueue(request)
取得任務狀態 WorkStatus
WorkManager.getInstance()
.getStatusById(request.id)
.observe(this, Observer { workStatus ->
if (workStatus != null && workStatus.state.isFinished) {
Log.d("outputData", workStatus.outputData.getString("OutputDataKey", ""))
}
})
到這邊就完成了最簡單的 WorkManager
的使用,明天繼續研究 WorkManager
的進階用法
有任何問題或講得不清楚的地方歡迎留言和我討論。
更歡迎留言糾正我任何說錯的地方!
下一篇:WorkManager (Last) 進階用法與總結