WorkManager - 如何按顺序执行作业

WorkManager - how to execute jobs sequentially

我有一项服务正在侦听传入的 FCM 通知。当收到这样的通知时,我 运行 使用 WorkManager 的工作。

当同时收到多个通知时,如何保证一次只执行一个作业?作业应按顺序执行。在这种情况下,我想发送一条短信,但不能同时发送。 (请注意,我在发送短信之前和之后在此作业中执行其他操作,例如 http 请求,这就是为什么我决定为其创建作业而不是直接从服务发送短信。)

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //...
        OneTimeWorkRequest sendSmsWorker = new OneTimeWorkRequest.Builder(SendSmsWorker.class).build();
        WorkManager.getInstance().enqueue(sendSmsWorker);
        //...
    }
}

我查看了 WorkManager 文档中的高级部分;它提到链式序列,但是这些序列必须明确地相互链接(beginWith/then/then/...)。

您需要将作业创建为具有相同组名的 OneTimeWorkRequest,并使用 APPEND 将它们作为唯一作业加入队列。 这将使所有作业附加到同一个链并按顺序执行。

请注意,您应该始终 return Result.SUCCESS,或至多 Result.RETRY。返回 Result.FAILURE 将取消所有排队的作业。 如果您需要知道作业是否失败,那么您可以在 worker setOutputData 中设置一个自定义标志来处理您可能需要的这种情况。

final String JOB_GROUP_NAME = "your_jobs_group_name";

......

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(YOUR_WORK.class)
    .setInputData(YOUR_WORK_DATA_BUILDER.build())
    .build();

final WorkManager workManager = WorkManager.getInstance();
WorkContinuation work = workManager.beginUniqueWork(JOB_GROUP_NAME, ExistingWorkPolicy.APPEND, request);
work.enqueue();