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
相关产品推荐
相关产品推荐

