
回复
哈喽!我是小L,那个在鸿蒙通知领域「让提醒更有温度」的女程序员~ 你知道吗?正确的代理提醒设计能让用户留存率提升25%!今天就来揭秘鸿蒙代理提醒的「精准触达法则」——类型选择、交互设计、权限管理、跨设备同步四大核心能力,让你的提醒既「恰到好处」又「温暖贴心」!
场景 | 倒计时提醒 | 日历提醒 | 闹钟提醒 | 组合策略 |
---|---|---|---|---|
会议倒计时(10分钟) | ● | 单触发+强提醒 | ||
每月账单(每月1日) | ● | 月循环+静默通知 | ||
每日喝水(9:00-18:00) | ● | 周循环+多设备同步 | ||
跨年活动(2024.12.31) | ● | ● | 日期触发+倒计时预热 |
// 基础提醒参数(通用)
interface BaseReminder {
reminderType: ReminderType; // 类型(必填)
title: string; // 标题(必填,≤30字)
content: string; // 内容(必填,≤100字)
notificationId: number; // 唯一通知ID(必填)
slotType: SlotType; // 通知渠道(必填,如社交/系统/警示)
wantAgent: WantAgent; // 点击通知跳转目标(必填)
}
// 倒计时提醒参数
interface TimerReminder extends BaseReminder {
reminderType: ReminderType.REMINDER_TYPE_TIMER;
triggerTimeInSeconds: number; // 触发时间(秒,≤30天)
expiredContent?: string; // 过期文案
}
// 日历提醒参数
interface CalendarReminder extends BaseReminder {
reminderType: ReminderType.REMINDER_TYPE_CALENDAR;
dateTime: DateTime; // 具体日期时间(年/月/日/时/分/秒)
repeatMonths?: number[]; // 重复月份(1-12,如[1,3,5])
repeatDays?: number[]; // 重复日期(1-31)
}
// 闹钟提醒参数
interface AlarmReminder extends BaseReminder {
reminderType: ReminderType.REMINDER_TYPE_ALARM;
hour: number; // 小时(0-23)
minute: number; // 分钟(0-59)
daysOfWeek?: number[]; // 重复星期(1-7,1=周一)
snoozeTimes?: number; // 贪睡次数(默认0)
timeInterval?: number; // 贪睡间隔(秒,默认300)
}
const reminder: CalendarReminder = {
// ...基础参数
largeIcon: 'icon_event.png', // 大图标(192x192px)
smallIcon: 'icon_event_small.png', // 小图标(48x48px)
progress: { // 进度条(如任务完成度)
current: 60,
total: 100,
show: true
},
actions: [ // 交互按钮
{
type: ActionButtonType.ACTION_BUTTON_TYPE_DEEP_LINK,
title: '查看详情',
deepLink: 'app://event/detail/123'
},
{
type: ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE,
title: '稍后提醒',
snoozeTime: 30 * 60 // 30分钟后重试
}
]
};
// 根据系统语言自动切换文案
const lang = ohos.i18n.getSystemLanguage();
const reminderContent = {
'zh-CN': '会议即将开始',
'en-US': 'Meeting starts soon',
'ja-JP': '会議が始まります'
}[lang] || 'Reminder';
// 检测用户状态(如驾驶/睡眠)自动调整提醒方式
const userStatus = deviceManager.getUserStatus();
if (userStatus === UserStatus.DRIVING) {
reminder.slotType = SlotType.SYSTEM_ALERT; // 驾驶模式强提醒
reminder.ringDuration = 10; // 延长响铃时间
} else if (userStatus === UserStatus.SLEEPING) {
reminder.slotType = SlotType.QUIET_NOTIFICATION; // 静默通知
reminder.vibrationPattern = []; // 关闭振动
}
// 主设备创建提醒时同步到其他设备
function publishCrossDeviceReminder(reminder: BaseReminder, devices: string[]) {
devices.forEach(deviceId => {
const crossReminder = {
...reminder,
targetDeviceId: deviceId, // 目标设备ID
syncType: SyncType.SYNC_TYPE_REALTIME // 实时同步
};
reminderAgentManager.publishReminderToDevice(crossReminder);
});
}
// 场景:手机创建提醒,同步到手表/平板
publishCrossDeviceReminder(timerReminder, ['watch-123', 'pad-456']);
// 根据设备类型调整提醒形式
const deviceInfo = deviceManager.getDeviceInfo();
if (deviceInfo.type === DeviceType.WATCH) {
reminder.content = reminder.content.slice(0, 50) + '...'; // 手表限制50字
reminder.actions = [{ type: ActionButtonType.ACTION_BUTTON_TYPE_CLOSE }]; // 仅保留关闭按钮
} else if (deviceInfo.type === DeviceType.TV) {
reminder.showOnLockScreen = true; // 电视锁屏显示
reminder.priority = NotificationPriority.HIGH; // 高优先级
}
{
"name": "ohos.permission.PUBLISH_AGENT_REMINDER",
"reason": "需要发送会议提醒"
}
permission.requestPermissionsFromUser([Permission.PUBLISH_AGENT_REMINDER])
.then((result) => {
if (result[0].granted) {
publishReminder(); // 授权后发布提醒
} else {
showPermissionGuide(); // 引导用户到设置页授权
}
});
【代理提醒权限申请】应用名称-包名
```
应用场景:每日健康打卡提醒,频率1次/天,通知标题:"该打卡啦",通知内容:"今日运动目标完成50%"
```
用户在手机上创建会议提醒,自动同步到手表,并在会议开始前1小时、10分钟触发渐进式提醒
// 主提醒(会议开始时)
const mainReminder: CalendarReminder = {
reminderType: ReminderType.REMINDER_TYPE_CALENDAR,
dateTime: { year: 2024, month: 5, day: 20, hour: 14, minute: 0 },
// ...其他参数
};
// 预提醒(提前1小时)
const preReminder: TimerReminder = {
reminderType: ReminderType.REMINDER_TYPE_TIMER,
triggerTimeInSeconds: 3600, // 提前1小时
// ...其他参数,内容为"会议将在1小时后开始"
};
const devices = await deviceManager.getPairedDevices(DeviceType.WATCH);
devices.forEach(deviceId => {
// 手表端提醒简化内容
const watchReminder = {
...mainReminder,
content: mainReminder.content.slice(0, 30) + '...',
targetDeviceId: deviceId
};
reminderAgentManager.publishReminderToDevice(watchReminder);
});
// 处理用户点击贪睡按钮
reminderAgentManager.on('snooze', (reminderId) => {
const snoozeTime = 10 * 60; // 10分钟后重试
reminderAgentManager.scheduleSnooze(reminderId, snoozeTime);
});
getReminderQuota
查询)
router.pushUrl('app://settings/reminder-permission'); // 跳转权限设置页
return;
"提醒我明天上午10点开会"
// 合并来自同一开发者的提醒(如电商应用的促销通知)
reminder.groupKey = 'com.example.shopping';
// 检测到用户进入商场时触发优惠券提醒
locationManager.on('enterGeofence', (geofenceId) => {
if (geofenceId === 'mall-123') {
publishReminder(shopCouponReminder);
}
});
用户满意度 = 提醒精准度 × 交互友好度 ÷ 打扰频率