我正在尝试使用 Kotlin 的 WorkManager 来安排一个 POST API 调用,该调用每 15 分钟运行一次,并且即使在设备重新启动或重新启动后也会继续执行。这就是我的目标:
该任务应使用 JSON 负载进行 POST API 调用。 它应该每 15 分钟执行一次。 该任务应在设备重新启动后持续存在,以便无需任何用户交互或应用程序重新启动即可继续。
class ApiWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
return try {
val client = OkHttpClient()
val jsonObject = JSONObject().apply {
put("key1", "value1")
put("key2", "value2")
}
val requestBody = RequestBody.create(
"application/json".toMediaTypeOrNull(),
jsonObject.toString()
)
val request = Request.Builder()
.url("https://yourapiendpoint.com/yourpostendpoint")
.post(requestBody)
.build()
val response = client.newCall(request).execute()
if (response.isSuccessful) {
Result.success()
} else {
Result.retry()
}
} catch (e: Exception) {
Result.retry()
}
}
}
fun scheduleApiWorker(context: Context) {
val workRequest = PeriodicWorkRequestBuilder<ApiWorker>(15, TimeUnit.MINUTES)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
)
.build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"ApiWorker",
ExistingPeriodicWorkPolicy.KEEP,
workRequest
)
}
这是设置定期 WorkManager 任务(即使在系统重新启动后也将每 15 分钟运行一次)的正确方法吗?
是的,即使系统重新启动后您也可以执行此操作。 您需要通过
BroadcastReceiver
类处理设备重启状态。
这是示例。
BroadcastReceiver
类:class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (Intent.ACTION_BOOT_COMPLETED == intent.action) {
scheduleApiWorker(context) // you worker function
}
}
}
2.在您的
AndroidManifest.xml
中注册接收器:
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
3.请确保在您的
RECEIVE_BOOT_COMPLETED
中请求 AndroidManifest.xml
权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
P.S 此设置可确保您的
WorkManager
任务在设备重新启动后自动重新安排,保持其定期执行而无需用户干预。