Kotlin WorkManager:每 15 分钟安排一次定期 POST API 调用,并在重新启动后保持持久性

问题描述 投票:0回答:1

我正在尝试使用 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 分钟运行一次)的正确方法吗?

android kotlin backgroundworker worker
1个回答
0
投票

是的,即使系统重新启动后您也可以执行此操作。 您需要通过

BroadcastReceiver
类处理设备重启状态。

这是示例。

  1. 创建一个
    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
任务在设备重新启动后自动重新安排,保持其定期执行而无需用户干预。

© www.soinside.com 2019 - 2024. All rights reserved.