特性
到目前为止都是基本操作,和一个普通的异步任务没有太大区别,接下来我们看看它不一样的一些地方。
环境约束
WorkManager 允许我们指定任务执行的环境,比如网络已连接、电量充足时等,在满足条件的情况下任务才会执行。
可指定的条件及设置方法如下:
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 网络状态
.setRequiresBatteryNotLow(true) // 不在电量不足时执行
.setRequiresCharging(true) // 在充电时执行
.setRequiresStorageNotLow(true) // 不在存储容量不足时执行
.setRequiresDeviceIdle(true) // 在待机状态下执行,需要 API 23
.build()
val request = OneTimeWorkRequest.Builder(MainWorker::class.java)
.setConstraints(constraints)
.build()
这个很好理解,除了网络状态,其他设置项都是传入一个布尔值,网络状态可选值如下:
状态 | 说明 |
---|---|
NOT_REQUIRED | 没有要求 |
CONNECTED | 网络连接 |
UNMETERED | 连接无限流量的网络 |
METERED | 连接按流量计费的网络 |
NOT_ROAMING | 连接非漫游网络 |
我们试一下效果,添加一个需要联网的条件,Activity 代码如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val dateFormat = SimpleDateFormat(“hh:mm:ss”, Locale.getDefault())
val data = Data.Builder()
.putString(“date”, dateFormat.format(Date()))
.build()
val request = OneTimeWorkRequest
.Builder(MainWorker::class.java)
.setConstraints(constraints)
.setInputData(data)
.build()
WorkManager.getInstance().enqueue(request)
WorkManager.getInstance()
.getStatusById(request.id)
.observe(