Android WorkManager
- 使用 WorkManager Api 可以轻松的调度即使在应用退出或者设备重启时仍应运行的可延迟一步任务
- 用统一的方法解决绝大部分后台问题
- 在应用被强退的时候也能执行任务
![C:\Users\00\AppData\Roaming\Typora\typora-user-images\image-20200624181222641.png](https://img-blog.csdnimg.cn/20200628171243977.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNzU1ODk3NA==,size_16,color_FFFFFF,t_70)
一、使用
简单的工作示例
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()
}
}
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"))
}
}
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)))
.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)))
.build()
return workRequest
}
}
以上介绍了 WorkManager 的基本使用,他在未来,很有可能承担起为所有后台任务,所以赶紧来试试吧!