後臺提醒與代理提醒:HarmonyOS Next 的智慧提醒管理

SameX發表於2024-10-27

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創內容,任何形式的轉載必須註明出處及原作者。

在移動應用開發中,及時有效的提醒功能對於提升使用者體驗至關重要。HarmonyOS Next 提供了代理提醒(Agent-powered Reminder)功能,它允許應用在後臺被掛起或程序終止後,由系統代理應用執行提醒任務,例如倒數計時、日曆、鬧鐘等。這種機制可以確保使用者及時收到重要的提醒資訊,同時避免應用過度消耗裝置資源。

代理提醒的型別與開發步驟

HarmonyOS Next 支援三種型別的代理提醒:

  • 倒數計時提醒:基於倒數計時的提醒功能,例如倒數計時 10 秒後提醒使用者。
  • 日曆提醒:基於日曆事件的提醒功能,例如在特定日期和時間提醒使用者。
  • 鬧鐘提醒:基於時鐘的提醒功能,例如每天早上 7 點提醒使用者起床。
    開發步驟
  1. 申請許可權:在應用配置檔案中新增 ohos.permission.PUBLISH_AGENT_REMINDER 許可權。
  2. 請求通知授權:獲得使用者授權後,才能使用代理提醒功能。
  3. 定義提醒內容:根據需要定義倒數計時、日曆或鬧鐘提醒內容,包括提醒標題、內容、過期內容、通知渠道等。
  4. 釋出提醒:呼叫 publishReminder 介面釋出提醒任務。
  5. 取消提醒:根據需要呼叫 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}`);
});

日曆提醒

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 對其進行了限制和規範。開發者需要向華為官方申請代理提醒許可權,才能使用該功能。
申請方法

  1. 透過 hwpush@huawei.com 郵箱向華為官方申請。
  2. 郵件主題:【代理提醒許可權申請】
  3. 郵件正文:包含企業名稱、應用名稱、應用包名、使用場景、通知標題、通知文字、通知場景、通知頻率等資訊。

總結

代理提醒為 HarmonyOS Next 提供了一種智慧的提醒管理方式,它可以有效地提升使用者體驗,並避免應用過度消耗裝置資源。咱們可以根據實際需求選擇合適的代理提醒型別,並結合 NotificationSlot 進行通知管理和最佳化。同時,咱們也需要注意代理提醒的許可權申請和使用規範,避免濫用該功能。

相關文章