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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:12:44