Android待办APP定时推送剩余任务通知功能故障求助
问题分析与解决方案
你的核心问题是AlarmReceiver完全没触发——既没输出日志,也没推送通知,但MainActivity里的闹钟设置日志能正常打印。下面按优先级给你排查修复步骤:
1. 先补Manifest里的Receiver注册(必做)
这是新手最容易漏的步骤,系统根本找不到你的AlarmReceiver,自然不会触发。打开AndroidManifest.xml,在<application>标签里加这段代码:
<receiver android:name=".AlarmReceiver" android:exported="false" /> <!-- 不需要外部APP调用的话,设为false更安全 -->
2. 适配Android 12+的闹钟限制
从Android 12(API 31)开始,系统对闹钟调度管得更严,还有几个坑:
- 测试别等20:00,先改短时间:如果当前时间已经过了晚上8点,
setRepeating会把第一次触发推迟到第二天。你可以临时修改setAlarm()里的时间设置,让闹钟2分钟后触发,方便快速测试:Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); // 改成当前时间+2分钟,测试完再改回20:00 calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 2); // 注释掉原来的小时分钟设置 // calendar.set(Calendar.HOUR_OF_DAY,20); // calendar.set(Calendar.MINUTE,00); - 补必要权限:
- Android 13及以上需要
POST_NOTIFICATIONS权限才能发通知,先在Manifest里加:
然后在<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />MainActivity的onCreate里动态申请(因为是危险权限):if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { ActivityResultContracts.RequestPermission requestPermission = new ActivityResultContracts.RequestPermission(); registerForActivityResult(requestPermission, isGranted -> { // 权限申请后的处理,比如提示用户 }).launch(Manifest.permission.POST_NOTIFICATIONS); } }
- Android 13及以上需要
3. 优化PendingIntent的创建逻辑
你现在用的PendingIntent.FLAG_IMMUTABLE在Android 12+是合法的,但如果之前创建过相同requestCode的PendingIntent,可能会出现旧Intent不更新的问题。改成下面的写法:
PendingIntent pendingIntent = PendingIntent.getBroadcast( this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT );
FLAG_UPDATE_CURRENT会确保更新已存在的PendingIntent,避免旧数据干扰。
4. 排查Receiver内部的潜在问题
等Receiver能触发后,如果还是没通知,检查这两点:
- 确保
R.drawable.icon这个图标存在,要是图标找不到,通知会创建失败。可以先换成系统默认图标测试,比如android.R.drawable.ic_dialog_info。 onReceive里别做太耗时的操作,数据库简单查询没问题,但如果数据量很大,建议换成WorkManager配合,避免ANR。
测试流程
- 先把Manifest的Receiver注册加上,这是基础。
- 把闹钟触发时间改成当前时间+2分钟,运行APP后退到后台。
- 等时间到了,去Logcat搜
AlarmReceiver的日志,要是能看到Alarm received,说明Receiver已经触发了。 - 要是日志有了但没通知,再检查权限和图标问题。
内容的提问来源于stack exchange,提问作者Aman Raj
相关产品推荐
相关产品推荐

