You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin按日期推送通知失败问题求助

排查Android定时通知推送失败的问题

我看了你的代码片段,发现几个关键问题,咱们一步步来修复:

1. Calendar设置逻辑错误

你连续两次调用calendar.set(Calendar.DAY_OF_WEEK, ...),第二次的设置会直接覆盖第一次,而且没有处理「当前时间已过本周周五设置点」的情况,导致Alarm可能不会触发。正确的Calendar配置应该是这样:

val calendar = Calendar.getInstance().apply {
    // 固定设置为周五
    set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)
    // 配置指定的时分秒,确保精确触发
    set(Calendar.HOUR_OF_DAY, hour)
    set(Calendar.MINUTE, min)
    set(Calendar.SECOND, 0)
    set(Calendar.MILLISECOND, 0)
    
    // 如果当前时间已经过了本周周五的这个时间点,自动顺延到下周五
    if (timeInMillis < System.currentTimeMillis()) {
        add(Calendar.WEEK_OF_YEAR, 1)
    }
}

2. AlarmManager的正确调用(你可能遗漏了这部分)

BroadcastReceiver需要通过AlarmManager触发,不同Android版本的API调用有差异,尤其是Android 12+需要特殊处理:

val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, YourBroadcastReceiver::class.java)
// Android 12+必须添加FLAG_IMMUTABLE,请求码建议设为唯一值(多通知场景)
val pendingIntent = PendingIntent.getBroadcast(
    this,
    1001,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

// 根据系统版本选择合适的触发方法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    // Android 12+推荐使用这个方法,保证后台也能触发
    alarmManager.setExactAndAllowWhileIdle(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        pendingIntent
    )
} else {
    alarmManager.setExact(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        pendingIntent
    )
}

3. BroadcastReceiver的通知构建必须满足Android 8.0+要求

在Receiver的onReceive方法里,必须先创建通知渠道,否则通知无法显示:

class YourBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        context ?: return
        
        // 第一步:创建通知渠道(Android 8.0+强制要求)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                "WEEKLY_NOTIFY_CHANNEL",
                "每周定时通知",
                NotificationManager.IMPORTANCE_DEFAULT
            ).apply {
                description = "每周五指定时间推送的提醒通知"
            }
            val notificationManager = context.getSystemService(NotificationManager::class.java)
            notificationManager.createNotificationChannel(channel)
        }
        
        // 第二步:构建并显示通知
        val notification = NotificationCompat.Builder(context, "WEEKLY_NOTIFY_CHANNEL")
            .setSmallIcon(R.drawable.ic_notification_icon) // 必须设置,否则通知不显示
            .setContentTitle("定时提醒")
            .setContentText("这是你设置的每周五通知")
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .build()
        
        NotificationManagerCompat.from(context).notify(1001, notification)
    }
}

4. 权限配置

Android 12+需要添加精确闹钟权限,在AndroidManifest.xml中声明:

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />

如果你的应用需要后台触发闹钟,还要在运行时检查权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    if (!alarmManager.canScheduleExactAlarms()) {
        // 跳转到系统设置请求权限
        startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
    }
}

内容的提问来源于stack exchange,提问作者Roy Oknin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:34:02