Hi,騷年,我是大 G,公眾號「 GitHub指北 」會推薦 GitHub 上有趣有用的計畫,一分鐘 get 一個優秀的開源計畫,挖掘開源的價值,歡迎關註。
2024年將是鴻蒙關鍵的一年,也可能是移動開發者的春天來了,今天分享鴻蒙如何來實作鬧鐘的,會有完整的案例。
後台代理提醒簡介
隨著生活節奏的加快,我們有時會忘記一些重要的事情或日子,所以提醒功能必不可少。套用可能需要在指定的時刻,向使用者發送一些業務提醒通知。例如購物類套用,希望在指定時間點提醒使用者有優惠活動。為滿足此類業務訴求,HarmonyOS提供後台代理提醒功能,在套用退居後台或結束後,計時和提醒通知功能被系統後台代理接管。
後台代理提醒業務型別:
倒計時類:基於倒計時的提醒功能,適用於短時的計時提醒業務。
行事曆類:基於行事曆的提醒功能,適用於較長時間的提醒業務。
鬧鐘類:基於時鐘的提醒功能,適用於指定時刻的提醒業務。
後台代理提醒就是由系統後台行程代理套用的提醒功能。後台代理提醒服務透過reminderAgentManager模組提供 提醒定義、建立提醒、取消提醒 等能力。
後台代理提醒服務提供統一的提醒管理能力,在套用退居後台或結束後,計時和提醒通知功能被系統後台代理接管。
以新增一個9點的喝水提醒為例:
假設使用者在8點新增這個喝水提醒,套用根據使用者設定的資訊生成提醒例項並釋出提醒。由後台代理提醒服務呼叫系統服務啟動計時。
到9點時,系統喚醒後台代理提醒服務釋出通知,最終由通知服務觸發桌面顯示通知。
在整個流程中,套用僅需:
使用reminderAgentManager模組的ReminderRequest類別定義提醒例項;
使用reminderAgentManager模組的publishReminder介面釋出提醒。
無需關註計時和通知釋出等功能如何實作。
若是刪除提醒流程,需要使用reminderAgentManager模組的cancelReminder介面取消提醒;若是修改提醒流程,則需要先刪除舊的提醒,再新增新的提醒。
給你的套用添加提醒
以鬧鐘套用為例,實作提醒功能有以下前置條件:
添加後台代理提醒使用許可權。
"module": {
...
"requestPermissions": [
{
"name": "ohos.permission.PUBLISH_AGENT_REMINDER"
}
]
}
匯入後台代理提醒reminderAgentManager模組,將此模組命名為reminderAgent。
import reminderAgent from '@ohos.reminderAgentManager';
如果是 新增提醒 ,實作步驟如下:
用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,
...
}
}
...
}釋出提醒。
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將介紹如何使用後台代理提醒,實作一個簡易鬧鐘。要求完成以下功能:
展示指標表盤或數位時間。
添加、修改和刪除鬧鐘。
展示鬧鐘列表,並可開啟和關閉單個鬧鐘。
鬧鐘到設定的時間後彈出提醒。
將鬧鐘的定時數據保存到輕量級資料庫。
相關概念
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"
}
}
]
使用說明
開啟套用,添加一個鬧鐘,鬧鐘到設定的時間後彈出提醒。
修改鬧鐘的時間,鬧鐘到設定的時間後彈出提醒。
刪除鬧鐘。
展示鬧鐘列表,並可開啟和關閉單個鬧鐘。
約束與限制
本範例僅支持標準系統上執行,支持裝置:華為手機。
本範例為Stage模型,支持API version 9。
本範例需要使用DevEco Studio 3.1 Release版本進行編譯執行。
源碼地址
點選下方的公眾號;
在後台發訊息「 鬧鐘 」即可獲取。