Android WorkManager
- 使用 WorkManager Api 可以輕鬆的調度即使在應用退出或者設備重啓時仍應運行的可延遲一步任務
- 用統一的方法解決絕大部分後臺問題
- 在應用被強退的時候也能執行任務
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uAZ8utmM-1593253767829)(C:\Users\00\AppData\Roaming\Typora\typora-user-images\image-20200624181222641.png)]
一、使用
-
引入 implementation 'androidx.work:work-runtime-ktx:2.4.0-beta01'
-
在build.gradle 下添加 compileSdkVersion 29 buildToolsVersion "29.0.2" kotlinOptions{ jvmTarget = 1.8 }
簡單的工作示例
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
Log.d("FanJava","start")
Thread.sleep(3000)
Log.d("FanJava","end")
return Result.success()
// return Result.failure()
}
}
class MainActivity : AppCompatActivity() {
//獲取 引用
private val workManager = WorkManager.getInstance(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val workRequest = OneTimeWorkRequestBuilder<MyWorker>().build()
workManager.enqueue(workRequest)
}
}
}
log
FanJava: start
FanJava: end
向工作任務傳遞參數,任務結束後觀察傳出的參數
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
val name = inputData.getString(INPUT_DATA_KEY)
Log.d("FanJava","$name start")
Thread.sleep(3000)
Log.d("FanJava","$name end")
return Result.success(workDataOf(OUTPUT_DATA_KEY to "$name success"))
// return Result.failure()
}
}
const val INPUT_DATA_KEY="input_data_key"
const val OUTPUT_DATA_KEY="output_data_key"
const val WORK_A_NAME="Work A"
const val WORK_B_NAME="Work B"
class MainActivity : AppCompatActivity() {
//獲取 引用
private val workManager = WorkManager.getInstance(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) //創建約束條件 “在聯網的情況下” 執行
.build()
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constraints) // 將約束條件加入任務
.setInputData(workDataOf(Pair(INPUT_DATA_KEY, WORK_A_NAME))) //傳遞一些數據 Key / Value 類型的
// .setInputData(workDataOf(INPUT_DATA_KEY to WORK_A_NAME)) //傳遞一些數據 Key / Value 類型的
.build()
workManager.enqueue(workRequest) //將任務加入隊列,滿足條件的時候會執行
//在這裏觀察 執行狀態
workManager.getWorkInfoByIdLiveData(workRequest.id).observe(this, Observer {
Log.d("FanJava","onCreate:${it.state}")
if (it.state==WorkInfo.State.SUCCEEDED){
Log.d("FanJava","onCreate:${it.outputData.getString(OUTPUT_DATA_KEY)}")
}
})
}
}
}
順序執行任務
const val INPUT_DATA_KEY="input_data_key"
const val OUTPUT_DATA_KEY="output_data_key"
const val WORK_A_NAME="Work A"
const val WORK_B_NAME="Work B"
class MainActivity : AppCompatActivity() {
//獲取 引用
private val workManager = WorkManager.getInstance(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val workRequest_A = CreateWorkRequest(WORK_A_NAME)
val workRequest_B = CreateWorkRequest(WORK_B_NAME)
workManager.beginWith(workRequest_A) //執行多個任務順序執行
.then(workRequest_B)
.enqueue()
}
}
private fun CreateWorkRequest(name:String): OneTimeWorkRequest {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) //創建約束條件 “在聯網的情況下” 執行
.build()
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constraints) // 將約束條件加入任務
.setInputData(workDataOf(Pair(INPUT_DATA_KEY, name))) //傳遞一些數據 Key / Value 類型的
// .setInputData(workDataOf(INPUT_DATA_KEY to WORK_A_NAME)) //傳遞一些數據 Key / Value 類型的
.build()
return workRequest
}
}