DEV Community

SameX
SameX

Posted on

后台提醒与代理提醒:HarmonyOS Next 的智能提醒管理

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

在移动应用开发中,及时有效的提醒功能对于提升用户体验至关重要。HarmonyOS Next 提供了代理提醒(Agent-powered Reminder)功能,它允许应用在后台被挂起或进程终止后,由系统代理应用执行提醒任务,例如倒计时、日历、闹钟等。这种机制可以确保用户及时收到重要的提醒信息,同时避免应用过度消耗设备资源。

代理提醒的类型与开发步骤

HarmonyOS Next 支持三种类型的代理提醒:

  • 倒计时提醒:基于倒计时的提醒功能,例如倒计时 10 秒后提醒用户。
  • 日历提醒:基于日历事件的提醒功能,例如在特定日期和时间提醒用户。
  • 闹钟提醒:基于时钟的提醒功能,例如每天早上 7 点提醒用户起床。 开发步骤
  • 申请权限:在应用配置文件中添加 ohos.permission.PUBLISH_AGENT_REMINDER 权限。
  • 请求通知授权:获得用户授权后,才能使用代理提醒功能。
  • 定义提醒内容:根据需要定义倒计时、日历或闹钟提醒内容,包括提醒标题、内容、过期内容、通知渠道等。
  • 发布提醒:调用 publishReminder 接口发布提醒任务。
  • 取消提醒:根据需要调用 cancelRemindercancelAllReminders 接口取消提醒任务。 ### 示例代码:倒计时提醒、日历提醒、闹钟提醒的设置 以下代码示例展示了如何设置三种类型的代理提醒: 倒计时提醒
import { reminderAgentManager } from '@kit.BackgroundTasksKit';
import { notificationManager } from '@kit.NotificationKit';
let targetReminderAgent: reminderAgentManager.ReminderRequestTimer = {
  reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_TIMER,
  triggerTimeInSeconds: 10,
  actionButton: [{ title: 'close', type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE }],
  wantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
  maxScreenWantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
  title: 'this is title',
  content: 'this is content',
  expiredContent: 'this reminder has expired',
  notificationId: 100,
  slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION
};
reminderAgentManager.publishReminder(targetReminderAgent).then((res: number) => {
  console.info('Succeeded in publishing reminder. ');
  let reminderId: number = res; // 发布的提醒 ID
}).catch((err: BusinessError) => {
  console.error(`Failed to publish reminder. Code: ${err.code}, message: ${err.message}`);
});
Enter fullscreen mode Exit fullscreen mode

日历提醒

import { reminderAgentManager } from '@kit.BackgroundTasksKit';
import { notificationManager } from '@kit.NotificationKit';
let targetReminderAgent: reminderAgentManager.ReminderRequestCalendar = {
  reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_CALENDAR,
  dateTime: {
    year: 2023,
    month: 1,
    day: 1,
    hour: 11,
    minute: 14,
    second: 30
  },
  repeatMonths: [1],
  repeatDays: [1],
  actionButton: [
    { title: 'close', type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE },
    { title: 'snooze', type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE }
  ],
  wantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
  maxScreenWantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
  ringDuration: 5,
  snoozeTimes: 2,
  timeInterval: 5 * 60,
  title: 'this is title',
  content: 'this is content',
  expiredContent: 'this reminder has expired',
  snoozeContent: 'remind later',
  notificationId: 100,
  slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION
};
reminderAgentManager.publishReminder(targetReminderAgent).then((res: number) => {
  console.info('Succeeded in publishing reminder. ');
  let reminderId: number = res; // 发布的提醒 ID
}).catch((err: BusinessError) => {
  console.error(`Failed to publish reminder. Code: ${err.code}, message: ${err.message}`);
});
Enter fullscreen mode Exit fullscreen mode

闹钟提醒

import { reminderAgentManager } from '@kit.BackgroundTasksKit';
import { notificationManager } from '@kit.NotificationKit';
let targetReminderAgent: reminderAgentManager.ReminderRequestAlarm = {
  reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM,
  hour: 23,
  minute: 9,
  daysOfWeek: [2],
  actionButton: [
    { title: 'close', type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE },
    { title: 'snooze', type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE }
  ],
  wantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
  maxScreenWantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
  ringDuration: 5,
  snoozeTimes: 2,
  timeInterval: 5 * 60,
  title: 'this is title',
  content: 'this is content',
  expiredContent: 'this reminder has expired',
  snoozeContent: 'remind later',
  notificationId: 99,
  slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION
};
reminderAgentManager.publishReminder(targetReminderAgent).then((res: number) => {
  console.info('Succeeded in publishing reminder. ');
  let reminderId: number = res; // 发布的提醒 ID
}).catch((err: BusinessError) => {
  console.error(`Failed to publish reminder. Code: ${err.code}, message: ${err.message}`);
});
Enter fullscreen mode Exit fullscreen mode

表格:代理提醒类型对比

提醒类型 触发方式 重复设置 通知按钮 适用场景
倒计时提醒 倒计时结束 不支持 关闭 临时提醒,例如会议倒计时
日历提醒 指定日期和时间 支持按月或按日重复 关闭、延时 定期提醒,例如生日、纪念日
闹钟提醒 指定时间 支持按周重复 关闭、延时 每日提醒,例如起床闹钟

提醒的通知管理与优化

开发者可以使用 NotificationSlot 来管理提醒通知的样式和渠道。通过设置不同的 NotificationSlot,开发者可以创建个性化、多样化的通知样式,并选择合适的渠道进行通知,例如系统通知栏、桌面小组件等。
代码示例

import { notificationManager } from '@kit.NotificationKit';
let slot: notificationManager.Slot = {
  slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
  slotId: 1,
  name: 'My Notification Slot',
  importance: notificationManager.Importance.HIGH,
  description: 'This is my custom notification slot'
};
notificationManager.addNotificationSlot(slot).then(() => {
  console.info('Notification slot added successfully');
}).catch((err: BusinessError) => {
  console.error(`Failed to add notification slot. Code: ${err.code}, message: ${err.message}`);
});
Enter fullscreen mode Exit fullscreen mode

代理提醒权限的申请方法

为了防止代理提醒功能被滥用,HarmonyOS Next 对其进行了限制和规范。开发者需要向华为官方申请代理提醒权限,才能使用该功能。
申请方法

  1. 通过 hwpush@huawei.com 邮箱向华为官方申请。
  2. 邮件主题:【代理提醒权限申请】
  3. 邮件正文:包含企业名称、应用名称、应用包名、使用场景、通知标题、通知文本、通知场景、通知频率等信息。 ### 总结 代理提醒为 HarmonyOS Next 提供了一种智能的提醒管理方式,它可以有效地提升用户体验,并避免应用过度消耗设备资源。咱们可以根据实际需求选择合适的代理提醒类型,并结合 NotificationSlot 进行通知管理和优化。同时,咱们也需要注意代理提醒的权限申请和使用规范,避免滥用该功能。

Top comments (0)