BroadcastReceiver的onReceive方法未被调用问题求助
我帮你梳理下代码里的几个关键问题,这些应该就是你的Alarm没触发BroadcastReceiver的原因:
1. Calendar时间配置逻辑完全错误
你当前用cal.add()叠加时间的顺序是混乱的,而且cal.add(Calendar.HOUR_OF_DAY, Calendar.AM)这行完全不对——Calendar.AM是值为1的常量,这会把当前小时加1,根本不是设置时间为上午。正确的做法是直接设置目标年月日时分,而不是在当前时间基础上累加(否则会出现时间偏移)。
修正后的Calendar代码:
Calendar cal = Calendar.getInstance(); // 直接设定目标年月日,替换掉原来的add操作 cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, day - 1); // 设置上午的具体时间,比如8点整 cal.set(Calendar.HOUR_OF_DAY, 8); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); // 可选:如果设置的时间已经早于当前时间,自动顺延到下一天 if (cal.getTimeInMillis() < System.currentTimeMillis()) { cal.add(Calendar.DATE, 1); }
2. Intent未匹配Manifest中定义的Action
你的Manifest里给Receiver配置了<action android:name="NOTIFICATION_SERVICE" />,但创建Intent时没有设置对应的Action,导致系统无法识别要触发哪个Receiver。
修正Intent代码:
Intent intent = new Intent(getActivity(), Receiver.class); // 添加与Manifest匹配的Action intent.setAction("NOTIFICATION_SERVICE");
3. Manifest中内部类Receiver的路径错误
如果Receiver是MainActivity的内部类,Manifest里的类名必须用$来分隔外部类和内部类,而不是.。正确的配置应该是:
<receiver android:name=".MainActivity$Receiver" android:exported="false" > <intent-filter> <action android:name="NOTIFICATION_SERVICE" /> </intent-filter> </receiver>
(如果Receiver是独立的顶层类,那原路径没问题,但从你的写法来看大概率是内部类)
4. PendingIntent Flag适配Android 12+
在Android 12及以上版本,创建PendingIntent时必须明确指定FLAG_IMMUTABLE或FLAG_MUTABLE,仅使用FLAG_UPDATE_CURRENT会抛出异常。如果你的Intent不需要后续修改,推荐使用FLAG_IMMUTABLE:
PendingIntent broadcast = PendingIntent.getBroadcast( getActivity(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
5. AlarmManager API适配Doze模式(可选)
对于Android 6.0(API 23)及以上系统,Doze模式会限制普通Alarm的触发。如果需要精确触发通知,建议使用setExactAndAllowWhileIdle替代set:
if (alarmManager != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast); } }
把以上这些点修正后,你的Alarm应该就能正常触发BroadcastReceiver了,届时可以通过Logcat查看notificationCreated是否正常输出。
内容的提问来源于stack exchange,提问作者Kristofer

