本文旨在深入探討華為鴻蒙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
進行通知管理和最佳化。同時,咱們也需要注意代理提醒的許可權申請和使用規範,避免濫用該功能。