首页 > 解决方案 > Kotlin - 事件前的 WorkManager 通知

问题描述

如何创建将在活动开始日期前几天发送的通知?

开始日期是使用日期范围选择器创建的,我需要收到一条通知,提醒我在 3 天内我有事要做。

标签: androidkotlinandroid-workmanager

解决方案


假设您的问题主要是在特定时间触发通知,我认为这样的事情会做:

  • 使用 AlarmManager 设置警报
  • 配置一个 BroadcastReceiver 来处理告警

下面的代码是我如何为每日通知(可以打开和关闭)实现它的一些修改版本。我使用自定义处理程序来发送消息,这导致处理消息以创建通知。实际通知的基础知识在代码中,但您需要一些努力来配置它。如果您需要更多详细信息,请告诉我。

class EventNotificationManager(ctx: Context) {

    private val context: WeakReference<Context> = WeakReference(ctx.applicationContext)
    private val flags = FLAG_UPDATE_CURRENT.let { if (SDK_INT < M) it else it or FLAG_IMMUTABLE }
    private val alarmIntent =
        getBroadcast(ctx, 1486, Intent(ctx, EventWakeUpJob::class.java), flags)

    private fun getContext() = context.get() ?: AppName.app.applicationContext

    fun startTask() {
        val ctx = getContext()
        val alarmManager = ctx.getSystemService(Context.ALARM_SERVICE) as? AlarmManager ?: return

        if (!isEventAlertingActive()) {
            alarmManager.cancel(alarmIntent)
        } else {
            var alertIt = customPickedDate.minDays(3)
            // Make sure it is at least after now
            alarmManager.setExact(RTC, alertIt.millis, alarmIntent)
        }
    }

    fun alertEvents() {
        // This is only the basics. Please see other examples for this.
        // Custom handler which does sendMessage + handleMessage
        // In handleMessage (SDK_INT >= O): 
        // NotificationManager.createNotificationChannel
        // msg = Notification.Builder(ctx, yourChannelId).apply { ... }.build()
        // NotificationManager.notify(customMessageId, msg)
    }
}

class EventWakeUpJob : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        context?.let { EventNotificationManager(it).alertEvents() }
    }
}

推荐阅读