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

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);
          }
      }
      

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。

测试流程

  1. 先把Manifest的Receiver注册加上,这是基础。
  2. 把闹钟触发时间改成当前时间+2分钟,运行APP后退到后台。
  3. 等时间到了,去Logcat搜AlarmReceiver的日志,要是能看到Alarm received,说明Receiver已经触发了。
  4. 要是日志有了但没通知,再检查权限和图标问题。

内容的提问来源于stack exchange,提问作者Aman Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:09:52