Androidx:WorkManager的enqueue方法未运行Worker

时间:2019-02-23 03:26:31

标签: android kotlin worker androidx android-workmanager

我想运行自定义的Worker-NotificationWorker-在设备上显示通知,然后设置日期和时间以使用WorkRequest进行显示。

这是我加入WorkRequest的方法,该方法在UI类中被调用(在我的应用程序中为Fragment):

fun notifyUserAt(dt: LocalDateTime, title: String, text: String) {
    val epoch = DateUtil.toEpochMilli(dt)
    val now = DateUtil.toEpochMilli(
        ZonedDateTime.now(AppRepository.zoneId).toLocalDateTime()
    )
    val delay = epoch - now + 10

    val data: Data = Data.Builder()
        .putString(NOTIF_TITLE, title)
        .putString(NOTIF_CONTENT_TEXT, text)
        .putLong(NOTIF_DATETIME, epoch)
        .build()

    val constraints: Constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.NOT_REQUIRED)
        .setRequiresCharging(false)
        .build()

    val notificationWork = OneTimeWorkRequestBuilder<NotificationWorker>()
        .setInputData(data)
        .setConstraints(constraints)
        .setInitialDelay(delay, TimeUnit.MILLISECONDS)
        .build()

    WorkManager.getInstance().enqueue(notificationWork)
}

请注意,在测试时, delay 变量设置为 10 毫秒(几乎没有延迟)。

这是我的工人班:

class NotificationWorker(val context: Context, params: WorkerParameters) :
    Worker(context, params) {

    override fun doWork(): Result {

        // Get data
        val title = inputData.getString(NOTIF_TITLE)
        val contentText = inputData.getString(NOTIF_CONTENT_TEXT)
        val epoch = inputData.getLong(NOTIF_DATETIME, 0L)

        // Build the notification
        val mNotification =
            NotificationCompat.Builder(context, NORMAL_CHANNEL_ID)
                .setContentTitle(title)
                .setContentText(contentText)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setContentIntent(overviewScreenIntent(context, epoch))
                .setAutoCancel(true)
                .build()!!

        val id = newNotificationId
        NotificationManagerCompat.from(context)
            .notify(id, mNotification)

        return Result.success()
    }

doWork的{​​{1}}方法的最后一行中调试时,我设置了一个断点,但是程序不会在那里暂停。我想念什么吗?

1 个答案:

答案 0 :(得分:0)

没关系,这可以通过通过setSmallIcon(icon)在通知中设置一个小图标来解决。之后,通知会完美显示。