通过通知操作安排WorkManager工作程序

时间:2019-06-07 08:00:09

标签: android android-workmanager

android文档显示了如何以编程方式安排 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)

但是当用户单击同一通知操作时,应该如何代替 IntentService 入队 WorkManager Worker

2 个答案:

答案 0 :(得分:0)

对于想知道如何解决此问题的任何人,我创建了一个额外的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) {
        // ...
    }
}

答案 1 :(得分:0)

从 API 级别 30 开始不推荐使用 IntentService:

<块引用>

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

解决方案:只需创建一个标准服务,将其与您的 PendingIntent 相关联,然后在服务的 onStartCommand-Method 中启动 WorkManager。