當前位置: 妍妍網 > 碼農

1.1K Star,一個完整的鴻蒙鬧鐘

2024-02-16碼農

Hi,騷年,我是大 G,公眾號「 GitHub指北 」會推薦 GitHub 上有趣有用的計畫,一分鐘 get 一個優秀的開源計畫,挖掘開源的價值,歡迎關註。

2024年將是鴻蒙關鍵的一年,也可能是移動開發者的春天來了,今天分享鴻蒙如何來實作鬧鐘的,會有完整的案例。

後台代理提醒簡介

隨著生活節奏的加快,我們有時會忘記一些重要的事情或日子,所以提醒功能必不可少。套用可能需要在指定的時刻,向使用者發送一些業務提醒通知。例如購物類套用,希望在指定時間點提醒使用者有優惠活動。為滿足此類業務訴求,HarmonyOS提供後台代理提醒功能,在套用退居後台或結束後,計時和提醒通知功能被系統後台代理接管。

後台代理提醒業務型別:

  • 倒計時類:基於倒計時的提醒功能,適用於短時的計時提醒業務。

  • 行事曆類:基於行事曆的提醒功能,適用於較長時間的提醒業務。

  • 鬧鐘類:基於時鐘的提醒功能,適用於指定時刻的提醒業務。

  • 點選放大

    後台代理提醒就是由系統後台行程代理套用的提醒功能。後台代理提醒服務透過reminderAgentManager模組提供 提醒定義、建立提醒、取消提醒 等能力。

    後台代理提醒服務提供統一的提醒管理能力,在套用退居後台或結束後,計時和提醒通知功能被系統後台代理接管。

    點選放大

    以新增一個9點的喝水提醒為例:

    假設使用者在8點新增這個喝水提醒,套用根據使用者設定的資訊生成提醒例項並釋出提醒。由後台代理提醒服務呼叫系統服務啟動計時。

    到9點時,系統喚醒後台代理提醒服務釋出通知,最終由通知服務觸發桌面顯示通知。

    點選放大

    在整個流程中,套用僅需:

    1. 使用reminderAgentManager模組的ReminderRequest類別定義提醒例項;

    2. 使用reminderAgentManager模組的publishReminder介面釋出提醒。

    無需關註計時和通知釋出等功能如何實作。

    若是刪除提醒流程,需要使用reminderAgentManager模組的cancelReminder介面取消提醒;若是修改提醒流程,則需要先刪除舊的提醒,再新增新的提醒。

    給你的套用添加提醒

    點選放大

    以鬧鐘套用為例,實作提醒功能有以下前置條件:

  • 添加後台代理提醒使用許可權。

    "module": {
    ...
    "requestPermissions": [
    {
    "name""ohos.permission.PUBLISH_AGENT_REMINDER"
    }
    ]
    }

  • 匯入後台代理提醒reminderAgentManager模組,將此模組命名為reminderAgent。

    import reminderAgent from '@ohos.reminderAgentManager';

  • 如果是 新增提醒 ,實作步驟如下:

    1. 用reminderAgent.ReminderRequest類別定義提醒例項。

      import reminderAgent from '@ohos.reminderAgentManager';
      ...
      export class ReminderService {
      public addReminder(alarmItem: ReminderItem, callback?: (reminderId: number) => void) {
      let reminder = this.initReminder(alarmItem);
      reminderAgent.publishReminder(reminder, (err, reminderId) => {
      if (callback != null) {
      callback(reminderId);
      }
      });
      }
      private initReminder(item: ReminderItem): reminderAgent.ReminderRequestAlarm {
      return {
      reminderType: item.remindType,
      hour: item.hour,
      minute: item.minute,
      daysOfWeek: item.repeatDays,
      title: item.name,
      ringDuration: item.duration * Constants.DEFAULT_TOTAL_MINUTE,
      snoozeTimes: item.intervalTimes,
      timeInterval: item.intervalMinute,
      actionButton: [
      {
      title: '關閉',
      type: reminderAgent.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
      },
      ...
      ],
      wantAgent: {
      pkgName: globalThis.bundleName,
      abilityName: globalThis.abilityName
      },
      notificationId: item.notificationId,
      ...
      }
      }
      ...
      }

    2. 釋出提醒。

      import reminderAgent from '@ohos.reminderAgentManager';
      ...
      export class ReminderService {
      public addReminder(alarmItem: ReminderItem, callback?: (reminderId: number) => void) {
      let reminder = this.initReminder(alarmItem);
      reminderAgent.publishReminder(reminder, (err, reminderId) => {
      if (callback != null) {
      callback(reminderId);
      }
      });
      }
      private initReminder(item: ReminderItem): reminderAgent.ReminderRequestAlarm {
      ...
      }
      ...
      }

    如果需要 刪除提醒 ,可以呼叫cancelReminder()介面實作。

    import reminderAgent from '@ohos.reminderAgentManager';
    ...
    export class ReminderService {
    public deleteReminder(reminderId: number) {
    reminderAgent.cancelReminder(reminderId);
    }
    ...
    }

    如果需要 修改提醒 ,則需要先進行舊提醒的刪除,再新增新的提醒。

    public async setAlarmRemind(alarmItem: AlarmItem) {
    let index = await this.findAlarmWithId(alarmItem.id);
    if (index !== Constants.DEFAULT_NUMBER_NEGATIVE) {
    this.reminderService.deleteReminder(alarmItem.id);
    else {
    ...
    }
    this.reminderService.addReminder(alarmItem, (newId) => {
    alarmItem.id = newId;
    ...
    })
    }

    案例:鬧鐘

    介紹

    本篇Codelab將介紹如何使用後台代理提醒,實作一個簡易鬧鐘。要求完成以下功能:

    1. 展示指標表盤或數位時間。

    2. 添加、修改和刪除鬧鐘。

    3. 展示鬧鐘列表,並可開啟和關閉單個鬧鐘。

    4. 鬧鐘到設定的時間後彈出提醒。

    5. 將鬧鐘的定時數據保存到輕量級資料庫。

    相關概念

  • Canvas:提供畫布元件,用於自訂繪制圖形。

  • CanvasRenderingContext2D:使用RenderingContext在Canvas元件上進行繪制,繪制物件可以是矩形、文本、圖片等。

  • 後台代理提醒:開發套用時,開發者可以呼叫後台提醒釋出的介面建立定時提醒,包括倒計時、行事曆、鬧鐘三種提醒型別。使用後台代理提醒能力後,套用可以被凍結或結束,計時和彈出提醒的功能將被後台系統服務代理。本套用中主要使用到後台代理提醒的兩個介面:

  • publishReminder

    釋出一個後台代理提醒,使用callback方式實作異步呼叫,該方法需要申請通知彈窗Notification.requestEnableNotification後才能呼叫。

  • cancelReminder

    取消指定id的提醒,使用callback方式實作異步呼叫。

  • 相關許可權

    本篇Codelab需要在module.json5中配置如下許可權:

    "requestPermissions": [
    {
    "name""ohos.permission.PUBLISH_AGENT_REMINDER",
    "reason""$string:reason",
    "usedScene": {
    "abilities": [
    "EntryAbility"
    ],
    "when""inuse"
    }
    }
    ]

    使用說明

    1. 開啟套用,添加一個鬧鐘,鬧鐘到設定的時間後彈出提醒。

    2. 修改鬧鐘的時間,鬧鐘到設定的時間後彈出提醒。

    3. 刪除鬧鐘。

    4. 展示鬧鐘列表,並可開啟和關閉單個鬧鐘。

    約束與限制

    1. 本範例僅支持標準系統上執行,支持裝置:華為手機。

    2. 本範例為Stage模型,支持API version 9。

    3. 本範例需要使用DevEco Studio 3.1 Release版本進行編譯執行。

    源碼地址

    1. 點選下方的公眾號;

    2. 在後台發訊息「 鬧鐘 」即可獲取。