本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
在移动应用开发中,及时有效的提醒功能对于提升用户体验至关重要。HarmonyOS Next 提供了代理提醒(Agent-powered Reminder)功能,它允许应用在后台被挂起或进程终止后,由系统代理应用执行提醒任务,例如倒计时、日历、闹钟等。这种机制可以确保用户及时收到重要的提醒信息,同时避免应用过度消耗设备资源。
代理提醒的类型与开发步骤
HarmonyOS Next 支持三种类型的代理提醒:
- 倒计时提醒:基于倒计时的提醒功能,例如倒计时 10 秒后提醒用户。
- 日历提醒:基于日历事件的提醒功能,例如在特定日期和时间提醒用户。
- 闹钟提醒:基于时钟的提醒功能,例如每天早上 7 点提醒用户起床。
开发步骤: - 申请权限:在应用配置文件中添加
ohos.permission.PUBLISH_AGENT_REMINDER
权限。 - 请求通知授权:获得用户授权后,才能使用代理提醒功能。
- 定义提醒内容:根据需要定义倒计时、日历或闹钟提醒内容,包括提醒标题、内容、过期内容、通知渠道等。
- 发布提醒:调用
publishReminder
接口发布提醒任务。 取消提醒:根据需要调用
cancelReminder
或cancelAllReminders
接口取消提醒任务。示例代码:倒计时提醒、日历提醒、闹钟提醒的设置
以下代码示例展示了如何设置三种类型的代理提醒:
倒计时提醒: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}`); });
日历提醒:
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}`); });
闹钟提醒:
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}`); });
表格:代理提醒类型对比
提醒类型 触发方式 重复设置 通知按钮 适用场景 倒计时提醒 倒计时结束 不支持 关闭 临时提醒,例如会议倒计时 日历提醒 指定日期和时间 支持按月或按日重复 关闭、延时 定期提醒,例如生日、纪念日 闹钟提醒 指定时间 支持按周重复 关闭、延时 每日提醒,例如起床闹钟 提醒的通知管理与优化
开发者可以使用
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}`); });
代理提醒权限的申请方法
为了防止代理提醒功能被滥用,HarmonyOS Next 对其进行了限制和规范。开发者需要向华为官方申请代理提醒权限,才能使用该功能。
申请方法:- 通过
hwpush@huawei.com
邮箱向华为官方申请。 - 邮件主题:
【代理提醒权限申请】
邮件正文:包含企业名称、应用名称、应用包名、使用场景、通知标题、通知文本、通知场景、通知频率等信息。
总结
代理提醒为 HarmonyOS Next 提供了一种智能的提醒管理方式,它可以有效地提升用户体验,并避免应用过度消耗设备资源。咱们可以根据实际需求选择合适的代理提醒类型,并结合
NotificationSlot
进行通知管理和优化。同时,咱们也需要注意代理提醒的权限申请和使用规范,避免滥用该功能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。