充电约束在 Android Kotlin 中的 WorkManager 中无法正常工作
Charging constraint not working properly in WorkManager In Android Kotlin
这段代码是我写的,给了两个约束:
- 网络已连接
- 充电器已连接
但是当我断开充电器并将代码放入队列并再次插入充电器时,它不会 运行 并在网络约束正常工作时保持在队列状态。
Activity Class
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.button.setOnClickListener {
setWorkManager()
}
}
private fun setWorkManager() {
val workManager = WorkManager.getInstance(applicationContext)
val constrains = Constraints.Builder()
.setRequiresCharging(true)
.build()
val uploadRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constrains)
.build()
workManager.enqueue(uploadRequest)
}
}
工人Class
class MyWorker(
context: Context,
param: WorkerParameters) : Worker(context, param) {
override fun doWork(): Result {
return try {
for (i in 0..600) {
Log.i("check", "in $i")
}
Result.success()
} catch (e: Exception) {
Result.failure()
}
}
}
您的代码看起来是正确的。
WorkManager 的 setRequiresCharging()
建立在上面
JobScheduler 的 setRequiresCharging()
有时可能会有令人惊讶的行为。来自 JobScheduler 文档:
For purposes of running jobs, a battery-powered device "charging" is not quite the same as simply being connected to power. If the device is so busy that the battery is draining despite a power connection, jobs with this constraint will not run. This can happen during some common use cases such as video chat, particularly if the device is plugged in to USB rather than to wall power.
我也看到有时候在模拟器上,需要将设备设置为正在充电,然后增加电池电量才能看到要安排的工作。
这段代码是我写的,给了两个约束:
- 网络已连接
- 充电器已连接
但是当我断开充电器并将代码放入队列并再次插入充电器时,它不会 运行 并在网络约束正常工作时保持在队列状态。
Activity Class
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.button.setOnClickListener {
setWorkManager()
}
}
private fun setWorkManager() {
val workManager = WorkManager.getInstance(applicationContext)
val constrains = Constraints.Builder()
.setRequiresCharging(true)
.build()
val uploadRequest = OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(constrains)
.build()
workManager.enqueue(uploadRequest)
}
}
工人Class
class MyWorker(
context: Context,
param: WorkerParameters) : Worker(context, param) {
override fun doWork(): Result {
return try {
for (i in 0..600) {
Log.i("check", "in $i")
}
Result.success()
} catch (e: Exception) {
Result.failure()
}
}
}
您的代码看起来是正确的。
WorkManager 的 setRequiresCharging()
建立在上面
JobScheduler 的 setRequiresCharging()
有时可能会有令人惊讶的行为。来自 JobScheduler 文档:
For purposes of running jobs, a battery-powered device "charging" is not quite the same as simply being connected to power. If the device is so busy that the battery is draining despite a power connection, jobs with this constraint will not run. This can happen during some common use cases such as video chat, particularly if the device is plugged in to USB rather than to wall power.
我也看到有时候在模拟器上,需要将设备设置为正在充电,然后增加电池电量才能看到要安排的工作。