从通知操作中调度WorkManager工作程序

4
安卓文档展示了如何以编程方式安排一个WorkManager Worker,就像这样:
val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
        .build()

WorkManager.getInstance().enqueue(uploadWorkRequest)

但是当用户点击通知操作时,您应该如何安排计划呢?

例如,以下是在用户单击通知操作时启动 IntentService 的代码:

class ApiCallService : IntentService("ApiCallService") {
   // ...
}

val notificationBuilder = NotificationCompat.Builder(context,
            NOTIFICATION_CHANNEL_ID)

val saveIntent = Intent(context, ApiCallService::class.java)
val savePendingIntent = PendingIntent.getBroadcast(context,
                0, saveIntent, 0)

notificationBuilder.addAction(R.drawable.ic_done_white_24dp,
                context.getString(R.string.save),
                savePendingIntent)

但是,当用户单击相同的通知操作时,您要如何将WorkManager Worker排队,而不是使用IntentService


1
您还可以从IntentService中调用WorkManager工作。因为没有PendingIntent,无法完成通知操作! - Nick Bapu
@nick-bapu 我也是这么想的。我希望有一种直接安排工作人员的方法,这就是我在这里提出这个问题的原因。 - Suyash
2个回答

3

从API级别30开始,IntentService已经被弃用:

"IntentService受Android 8.0(API级别26)强制执行的所有后台执行限制的约束。考虑在Android 8.0或更高版本上运行时使用 WorkManager 或 JobIntentService,因为它们在运行时使用作业而不是服务。" https://developer.android.com/reference/android/app/IntentService

解决方案:只需创建一个标准服务,将其与 PendingIntent 关联,并在服务的 onStartCommand 方法中启动 WorkManager。


2

IntentService已经被弃用,请查看其他答案。

如果有人想知道我是如何解决这个问题的,我创建了一个额外的IntentService来调度不同的工作程序。

最初的回答已经过时,请查看其他答案。

对于任何想知道我如何解决这个问题的人,我创建了一个额外的IntentService来安排不同的工作者。

class WorkManagerService : IntentService("WorkManagerService") {
    override fun onHandleIntent(intent: Intent?) {
        when (intent?.action) {
            ACTION_SCHEDULE_WORKER1 -> {
                scheduleWorker1(intent)
            },
            ACTION_SCHEDULE_WORKER2 -> {
                scheduleWorker2(intent)
            }
        }
    }

    private fun scheduleWorker1(intent: Intent) {
        // ...

        val worker1 = OneTimeWorkRequestBuilder<Worker1>()
                .setConstraints(networkConstraint)
                .setInputData(workData)
                .build()

        WorkManager.getInstance().enqueue(worker1)
    }

    private fun scheduleWorker2(intent: Intent) {
        // ...
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接