CoroutineWorker:在 cancelPendingIntent 操作上中断 doWork()

CoroutineWorker: interrupt doWork() on cancelPendingIntent action

是否可以在触发通知的取消操作时取消在doWork()中完成的工作?

class TestWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {

    override suspend fun doWork(): Result {

        setForeground(createForegroundInfo())
        doStuff()
        return Result.success()
    }

    private fun doStuff() {
        for (i in 0..10) {
            Log.d(LOG, "Can this be interrupted?")
            Thread.sleep(1000)
        }
    }

    private fun createForegroundInfo(): ForegroundInfo {
        val cancelIntent = WorkManager.getInstance(applicationContext)
            .createCancelPendingIntent(id)

        val notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)

            ...

            .addAction(android.R.drawable.ic_delete, "cancel", cancelIntent)
            .build()

        createChannelIfNeeded()
        return ForegroundInfo(1, notification)
    }

Thread.sleep(1000) 不能被协程中断。如果您使用 delay(1000),那么它将根据 this blog post.

被中断
private suspend fun doStuff() {
    for (i in 0..10) {
        Log.d(LOG, "Can this be interrupted?")
        delay(1000)
    }
}