通知與提醒系統:即時消息與日程管理實現

概述

在HarmonyOS應用開發中,通知與提醒系統是連接用户與應用的重要橋樑。本文將深入探討如何在HarmonyOS Next(API 10+)中實現高效的通知管理和智能的日程提醒功能。

官方參考資料:

  • 通知 API參考
  • 通知開發指南

基礎概念

什麼是HarmonyOS通知系統?

HarmonyOS通知系統是一個統一的消息傳遞框架,允許應用向用户展示重要信息,即使用户沒有主動使用該應用。

核心特點:

  • 統一的通知管理中心
  • 多設備協同通知
  • 豐富的模板支持
  • 智能的免打擾管理

通知類型分類

在HarmonyOS Next中,通知主要分為以下幾類:

  • 即時通知:需要用户立即關注的消息
  • 持續通知:在後台運行的任務狀態
  • 計劃通知:在特定時間觸發的提醒
  • 進度通知:顯示任務進度的通知

環境配置

權限聲明

首先需要在module.json5文件中聲明必要的權限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.PUBLISH_AGENT_REMINDER",
        "reason": "$string:reminder_permission_reason",
        "usedScene": {
          "abilities": ["MainAbility"],
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.NOTIFICATION_CONTROLLER",
        "reason": "$string:notification_permission_reason"
      }
    ]
  }
}

導入必要模塊

import notificationManager from '@ohos.notificationManager';
import reminderAgent from '@ohos.reminderAgent';
import common from '@ohos.app.ability.common';

即時消息通知實現

發佈基礎通知

最基本的通知發佈只需要幾個關鍵參數:

// 發佈簡單文本通知
async function publishBasicNotification(): Promise<void> {
  try {
    const request: notificationManager.NotificationRequest = {
      content: {
        contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
        normal: {
          title: '新消息提醒',
          text: '您收到一條新的即時消息',
          additionalText: '剛剛'
        }
      },
      id: 1,  // 通知ID,用於後續更新或取消
      slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION  // 使用社交通信槽位
    };
    
    await notificationManager.publish(request);
    console.info('通知發佈成功');
  } catch (error) {
    console.error(`發佈通知失敗: ${error.code}, ${error.message}`);
  }
}

通知槽位(Slot)管理

通知槽位決定了通知的顯示方式和行為:

槽位類型

適用場景

默認行為

SlotType.SOCIAL_COMMUNICATION

社交消息

振動+聲音

SlotType.SERVICE_INFORMATION

服務信息

靜音

SlotType.CONTENT_INFORMATION

內容更新

輕微提示

SlotType.OTHER_TYPES

其他類型

系統默認

// 創建自定義通知槽位
async function createNotificationSlot(): Promise<void> {
  const slot: notificationManager.NotificationSlot = {
    type: notificationManager.SlotType.SOCIAL_COMMUNICATION,
    level: notificationManager.SlotLevel.LEVEL_HIGH,  // 高優先級
    desc: '即時消息通知槽位',
    vibration: true,
    sound: 'notification_sound.wav',
    light: true,
    bypassDnd: false  // 不繞過免打擾
  };
  
  try {
    await notificationManager.addSlot(slot);
    console.info('通知槽位創建成功');
  } catch (error) {
    console.error(`創建槽位失敗: ${error.code}, ${error.message}`);
  }
}

富媒體通知實現

HarmonyOS支持豐富的多媒體通知內容:

// 發佈帶圖片的長文本通知
async function publishRichNotification(): Promise<void> {
  const request: notificationManager.NotificationRequest = {
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_LONG_TEXT,
      longText: {
        title: '詳細消息通知',
        text: '這是一條包含詳細內容的長文本通知,用户可以展開查看更多信息...',
        additionalText: '長文本',
        briefText: '消息摘要',
        expandedTitle: '消息詳情',
        longText: '這裏是完整的消息內容,可以包含大量的文本信息...',
        image: $r('app.media.message_image')  // 引用資源文件中的圖片
      }
    },
    id: 2,
    slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
    deliveryTime: new Date().getTime(),  // 立即發送
    showDeliveryTime: true  // 顯示發送時間
  };
  
  await notificationManager.publish(request);
}

通知操作按鈕

為通知添加交互按鈕:

// 添加操作按鈕的通知
async function publishNotificationWithActions(): Promise<void> {
  const wantAgentInfo: notificationManager.WantAgentInfo = {
    wants: [
      {
        bundleName: 'com.example.myapp',
        abilityName: 'MessageDetailAbility',
        action: 'action.view.detail'
      }
    ],
    operationType: notificationManager.OperationType.START_ABILITY,
    requestCode: 1001
  };
  
  const request: notificationManager.NotificationRequest = {
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
      normal: {
        title: '交互式通知',
        text: '點擊按鈕執行操作',
        additionalText: '可操作'
      }
    },
    id: 3,
    actionButtons: [
      {
        title: '回覆',
        wantAgent: wantAgentInfo,
        autoCancel: true  // 點擊後自動取消通知
      },
      {
        title: '標記已讀',
        wantAgent: wantAgentInfo,
        autoCancel: true
      }
    ]
  };
  
  await notificationManager.publish(request);
}

日程管理提醒實現

提醒代理基礎

HarmonyOS的提醒代理(ReminderAgent)提供了強大的日程提醒功能:

// 創建一次性定時提醒
async function createOneTimeReminder(): Promise<number> {
  const reminder: reminderAgent.ReminderRequest = {
    reminderType: reminderAgent.ReminderType.REMINDER_TYPE_TIMER,
    triggerTimeInSeconds: Math.floor(Date.now() / 1000) + 3600,  // 1小時後觸發
    title: '會議提醒',
    content: '團隊週會將在1小時後開始',
    expiredContent: '會議提醒已過期',
    snoozeContent: '會議提醒已延遲',
    notificationId: 1001,
    slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION,
    wantAgent: {
      pkgName: 'com.example.myapp',
      abilityName: 'MeetingDetailAbility'
    }
  };
  
  try {
    const reminderId = await reminderAgent.publishReminder(reminder);
    console.info(`提醒創建成功,ID: ${reminderId}`);
    return reminderId;
  } catch (error) {
    console.error(`創建提醒失敗: ${error.code}, ${error.message}`);
    return -1;
  }
}

日曆提醒實現

基於日曆事件的提醒更加精確:

// 創建日曆事件提醒
async function createCalendarReminder(): Promise<number> {
  const calendarReminder: reminderAgent.ReminderRequestCalendar = {
    reminderType: reminderAgent.ReminderType.REMINDER_TYPE_CALENDAR,
    dateTime: {
      year: 2024,
      month: 6,
      day: 15,
      hour: 14,
      minute: 30,
      second: 0
    },
    repeatMonths: [1, 2, 3, 4, 5, 6],  // 重複月份
    repeatDays: [1, 15],  // 每月1號和15號
    title: '月度報告提交',
    content: '請提交本月的項目進度報告',
    expiredContent: '報告提交已過期',
    snoozeContent: '報告提醒已延遲',
    notificationId: 1002,
    slotType: notificationManager.SlotType.SERVICE_INFORMATION
  };
  
  const reminderId = await reminderAgent.publishReminder(calendarReminder);
  return reminderId;
}

提醒管理操作

// 提醒管理類
class ReminderManager {
  private reminderIds: number[] = [];
  
  // 取消特定提醒
  async cancelReminder(reminderId: number): Promise<void> {
    try {
      await reminderAgent.cancelReminder(reminderId);
      const index = this.reminderIds.indexOf(reminderId);
      if (index > -1) {
        this.reminderIds.splice(index, 1);
      }
      console.info(`提醒 ${reminderId} 已取消`);
    } catch (error) {
      console.error(`取消提醒失敗: ${error.code}, ${error.message}`);
    }
  }
  
  // 取消所有提醒
  async cancelAllReminders(): Promise<void> {
    try {
      await reminderAgent.cancelAllReminders();
      this.reminderIds = [];
      console.info('所有提醒已取消');
    } catch (error) {
      console.error(`取消所有提醒失敗: ${error.code}, ${error.message}`);
    }
  }
  
  // 獲取有效提醒
  async getValidReminders(): Promise<reminderAgent.ReminderRequest[]> {
    try {
      const reminders = await reminderAgent.getValidReminders();
      return reminders;
    } catch (error) {
      console.error(`獲取提醒失敗: ${error.code}, ${error.message}`);
      return [];
    }
  }
}

高級特性

通知分組管理

對於聊天類應用,消息分組顯示非常重要:

// 創建分組通知
async function publishGroupedNotification(): Promise<void> {
  const groupNotification: notificationManager.NotificationRequest = {
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
      normal: {
        title: '聊天羣組',
        text: '3條新消息',
        additionalText: '羣聊'
      }
    },
    id: 100,
    groupName: 'chat_group_001',  // 分組名稱
    groupOverview: '您有3條未讀消息',  // 分組概覽
    slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION
  };
  
  // 發佈分組摘要通知
  await notificationManager.publish(groupNotification);
  
  // 發佈分組內的具體消息
  const messages = [
    { id: 101, text: 'Alice: 你好!' },
    { id: 102, text: 'Bob: 項目進展如何?' },
    { id: 103, text: 'Charlie: 會議記錄已上傳' }
  ];
  
  for (const message of messages) {
    const messageRequest: notificationManager.NotificationRequest = {
      content: {
        contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
        normal: {
          title: '羣組消息',
          text: message.text,
          additionalText: '剛剛'
        }
      },
      id: message.id,
      groupName: 'chat_group_001',
      slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION
    };
    
    await notificationManager.publish(messageRequest);
  }
}

進度通知實現

// 發佈進度通知
class ProgressNotification {
  private request: notificationManager.NotificationRequest;
  private currentProgress: number = 0;
  
  constructor() {
    this.request = {
      content: {
        contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_PROGRESS,
        progress: {
          title: '文件下載',
          text: '正在下載...',
          additionalText: '0%',
          progressValue: 0,
          maxProgress: 100,
          status: '進行中'
        }
      },
      id: 200,
      slotType: notificationManager.SlotType.SERVICE_INFORMATION,
      isOngoing: true  // 持續通知,用户無法手動清除
    };
  }
  
  // 開始進度通知
  async start(): Promise<void> {
    await notificationManager.publish(this.request);
  }
  
  // 更新進度
  async updateProgress(progress: number): Promise<void> {
    this.currentProgress = progress;
    this.request.content.progress.progressValue = progress;
    this.request.content.progress.additionalText = `${progress}%`;
    
    if (progress >= 100) {
      this.request.content.progress.status = '已完成';
      this.request.isOngoing = false;  // 完成後允許用户清除
    }
    
    await notificationManager.publish(this.request);
  }
  
  // 完成進度
  async complete(): Promise<void> {
    await this.updateProgress(100);
  }
}

智能免打擾集成

// 檢查和管理免打擾設置
async function manageDndSettings(): Promise<void> {
  try {
    // 獲取當前免打擾模式
    const dndMode = await notificationManager.getDoNotDisturb();
    
    console.info(`當前免打擾模式: ${dndMode.type}`);
    
    // 檢查是否可以發送通知
    if (dndMode.type === notificationManager.DoNotDisturbType.NONE) {
      console.info('可以正常發送通知');
    } else {
      console.info('當前處於免打擾模式,通知可能被靜音');
    }
    
  } catch (error) {
    console.error(`獲取免打擾設置失敗: ${error.code}, ${error.message}`);
  }
}

總結與最佳實踐

通過本文的學習,我們深入探討了HarmonyOS Next中的通知與提醒系統實現,從基礎概念到高級特性,全面掌握了即時消息通知和日程提醒的開發技能。

核心要點回顧

  • 通知系統基礎:理解了通知的類型、權限配置和槽位管理機制
  • 即時消息實現:掌握了基礎通知、富媒體通知和交互式通知的開發方法
  • 日程管理能力:學習了一次性提醒和日曆事件提醒的創建與管理
  • 高級特性應用:實現了通知分組、進度通知和免打擾集成等功能

實踐建議

在實際項目開發中,建議遵循以下最佳實踐:

  1. 合理的通知頻率:避免過於頻繁的通知,影響用户體驗
  2. 精準的權限管理:僅請求必要的通知權限,並提供清晰的使用説明
  3. 場景化的槽位選擇:根據通知類型選擇合適的槽位,提供一致的用户體驗
  4. 完善的錯誤處理:添加適當的錯誤捕獲和重試機制,確保通知可靠性
  5. 測試驅動開發:在不同設備和系統版本上進行充分測試,確保兼容性

未來展望

隨着HarmonyOS生態的不斷髮展,通知與提醒系統也在持續演進。未來我們可以期待:

  • 更多元化的通知模板和交互方式
  • 更智能的用户行為分析和個性化通知推送
  • 更深入的多設備協同體驗,實現通知在不同設備間的無縫流轉
  • 更豐富的系統集成能力,與日曆、任務管理等系統功能深度融合

繼續學習

想要進一步提升HarmonyOS應用開發能力,可以關注以下相關主題:

  • HarmonyOS分佈式任務調度
  • 後台任務管理與優化
  • 用户隱私保護最佳實踐
  • 應用性能調優技巧

通過合理利用通知與提醒功能,我們可以構建出更加智能、高效、用户友好的HarmonyOS應用,為用户提供卓越的移動體驗。

祝您開發順利!