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 ?
答案 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。