HarmonyOS 鸿蒙Next求助,自己开发的app闹钟不响

HarmonyOS 鸿蒙Next求助,自己开发的app闹钟不响 自己想开发了一个闹钟app,但是怎么调试闹钟就是不想,请问要怎么实现闹钟功能

9 回复

可以通过代理提醒实现

应用退到后台或进程终止后,仍然有一些提醒用户的定时类通知,为满足此类功能场景,系统提供了代理提醒的能力。当应用退至后台或进程终止后,系统会代理应用做定时提醒。当前支持的提醒类型包括:倒计时、日历和闹钟。为了防止代理提醒被滥用于广告、营销类提醒,影响用户体验,部分设备上代理提醒增加了管控机制,应用无法直接使用代理提醒,管控后的使用方法请参考管控限制

定义闹钟:

let alarm: reminderAgentManager.ReminderRequestAlarm = {
  reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM, // 提醒类型为闹钟类型
  hour: time.hour, // 指明提醒的目标时刻
  minute: time.minute, // 指明提醒的目标分钟
  actionButton: // 设置弹出的提醒通知信息上显示的按钮类型和标题
  [
    {
      title: context.resourceManager.getStringSync($r('app.string.alarm_clock_close').id), // "app.string.alarm_clock_close"资源文件中的value值为"关闭闹钟"
      type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
    },
    {
      title: context.resourceManager.getStringSync($r('app.string.alarm_clock_postpone').id), // "app.string.alarm_clock_postpone"资源文件中的value值为"推迟闹钟"
      type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE
    }
  ],
  slotType: notificationManager.SlotType.CONTENT_INFORMATION, // 指明提醒的Slot类型
  ringDuration: Constant.REMINDER_DURATION, // 指明响铃时长(单位:秒)
  wantAgent: { // 点击提醒通知后跳转的目标UIAbility信息
    pkgName: 'com.example.reminderagentmanager',
    abilityName: 'EntryAbility'
  },
  title: context.resourceManager.getStringSync($r('app.string.alarm_clock').id), // 指明提醒标题, "app.string.alarm_clock"资源文件中的value值为"闹钟"
  content: context.resourceManager.getStringSync($r('app.string.alarm_clock_reach').id), // 指明提醒内容, "app.string.alarm_clock_reach"资源文件中的value值为"闹钟时间已到"
  snoozeTimes: 0, // 指明延迟提醒次数
  timeInterval: 0, // 执行延迟提醒间隔(单位:秒)
  daysOfWeek: [] // 指明每周哪几天需要重复提醒
}

更多关于HarmonyOS 鸿蒙Next求助,自己开发的app闹钟不响的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


闹钟类功能不要用普通 setTimeout、前台定时器或长时任务硬扛;应用退后台或进程结束后,这些方案都不可靠。HarmonyOS 里做闹钟/倒计时/日历提醒,应该用 Background Tasks Kit 的代理提醒 reminderAgentManager。

基本流程是:先在 AGC 的开放能力管理里确认/申请“代理提醒”能力;module.json5 声明 ohos.permission.PUBLISH_AGENT_REMINDER;运行时请求通知授权;然后构造 ReminderRequestAlarm,填 reminderType: REMINDER_TYPE_ALARM、hour、minute、daysOfWeek、title、content、ringDuration、slotType、wantAgent 等字段,最后调用 reminderAgentManager.publishReminder(),并保存返回的 reminderId,后续用 getValidReminders()/cancelReminder() 做查询和取消。

还要注意约束:手机/平板/PC/2in1 上代理提醒有管控,不是所有应用和场景都能直接用;普通应用有效提醒数量也有限制。调试时建议先用真机或 API 20+ 模拟器,确认通知授权、代理提醒能力开关、Profile 重新生成/签名都生效。

代理提醒啊,申请权限就可以了

1、需要确认下你这边是使用的什么服务进行的闹钟提醒,是日历服务(Calendar Kit)还是代理提醒(Reminder)
2、日历服务可以参考日程管理的开发指南;
3、代理提醒需要申请代理提醒开放能力,检查开放能力是否申请,PUBLISH_AGENT_REMINDER代理权限是否申请。

试试Calendar Kit(日历服务),它提供日历与日程管理能力,通常是指可以用于访问和操作日历数据的API(应用程序接口)。这些接口允许开发者将其他应用中的工作、生活中与时间相关的日程服务(如出行、餐饮、运动、娱乐等)与系统日历进行集成,从而实现日程管理、事件创建、查询等功能。
官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/calendarmanager-overview

可以试试Calendar Kit(日历服务),它提供日历与日程管理能力,通常是指可以用于访问和操作日历数据的API(应用程序接口)。这些接口允许开发者将其他应用中的工作、生活中与时间相关的日程服务(如出行、餐饮、运动、娱乐等)与系统日历进行集成,从而实现日程管理、事件创建、查询等功能。

但是我不确定它能不能唤醒APP并播放闹钟声音,这个需要你自己去探索一下!

官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/calendarmanager-overview

还没弄过,

在鸿蒙Next中,应用自定义闹钟不响常见原因:

  • 后台任务被限制:需申请ohos.permission.KEEP_BACKGROUND_RUNNING权限,并配置长时任务类型为alarm
  • 闹钟注册方式:使用reminderAgentManager.publishReminder接口发布闹钟提醒,而非传统Timer或AlarmManager(鸿蒙无此API)。
  • 电源管理与休眠:设备熄屏后可能进入深度休眠,需检查powerManager是否为应用添加唤醒锁。
  • 应用被挂起:确保应用已加入受保护后台应用白名单或用户允许自启动。

检查上述配置是否完整。

检查以下关键点,大概率能解决:

  1. 权限声明:在 module.json5 中声明权限:
"requestPermissions": [
  { "name": "ohos.permission.PUBLISH_AGENT_REMINDER" }
]

该权限为系统授权,无需动态申请。

  1. 使用 reminderAgentManager 发布闹钟
import reminderAgentManager from '@ohos.reminderAgentManager';
import { BusinessError } from '@ohos.base';

let reminderReq: reminderAgentManager.ReminderRequestAlarm = {
  reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM,
  triggerTimeInSeconds: 1687776000000, // 具体响铃时间(毫秒时间戳)
  ringDurationInSeconds: 60,           // 响铃时长
  title: "闹钟提醒",
  content: "起床啦",
  actionButton: [{
    title: "关闭",
    type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
  }]
};

reminderAgentManager.publishReminder(reminderReq).then(() => {
  console.log("闹钟发布成功");
}).catch((err: BusinessError) => {
  console.error("闹钟发布失败:", err.code, err.message);
});

注意时间戳单位是毫秒,与部分API的秒不同。

  1. 常见失败原因
  • 闹钟类型错误:必须为 REMINDER_TYPE_ALARM,其他类型受系统限制可能不响。
  • 时间戳已过期或格式错误。
  • 未在 onDestroy 中取消提醒,导致资源占用,可调用 cancelReminder
  • 调试时设备时间未真实流逝,建议用真机测试并等待到设定时间。

确保以上三点,闹钟功能即可正常工作。

回到顶部