天天看點

#夏日挑戰賽# HarmonyOS - 實作消息定時提醒

作者:張明偉

本文正在參加星光計劃3.0–夏日挑戰賽

前言

在一些應用中,需要通過時間設定提醒使用者操作,如鬧鐘,象棋步數倒計時等。

設計思路:将對時間的擷取與響應的結果拆分開,時間的擷取可以有倒計時與直接設計時間。響應結果可以是:震動,閃爍,通知欄,鈴聲。

項目涵蓋了IntetAgent,通知,以及JS FA調用PA等知識點,項目應用到了前面同僚編寫的計時器元件#夏日挑戰賽# HarmonyOS - 自定義元件之計時器

效果展示

如果需要展示震動和彈出效果,需要通過實體機進入通知管理,勾選橫幅通知和鎖屏通知并且修改震動為其他震動方式。

倒計時提醒如下圖:

#夏日挑戰賽# HarmonyOS - 實作消息定時提醒

鬧鐘類提醒如下圖:

#夏日挑戰賽# HarmonyOS - 實作消息定時提醒

實作步驟

1. 聲明權限

"reqPermissions": [  {"name": "ohos.permission.PUBLISH_AGENT_REMINDER"  }]
           

2. 建構前端頁面

前端頁面主要是擷取設定的倒計時以及設定的鬧鐘類的時間,封裝進一個對象ActionData通過調用接口傳遞給PA處理。

主要分為兩部分:一部分是倒計時提醒界面,一部分是鬧鐘類提醒界面。

在編寫頁面的時候遇到了一個問題:由于初步編寫hml頁面,不知道如何實作input輸入框的雙向綁定,後面請教後解決:通過change事件來觸發

hml代碼如下:

<element name="countDown" src="../countDown/countDown.hml">
</element>
<div class="container">
<!--倒計時功能區域-->
    <div class="box">
        <text>倒計時: {{ leftTime }} s</text>
        <input type="text" id="countDown" onchange="changeCountDown"></input>
        <countDown time="{{ leftTime }}">
        </countDown>
        <div>
            <button class="button" value="設定" onclick="alarmCountdown"></button>
        </div>
    </div>
<!--定時功能區域-->
    <div class="box">
        <form>
            <text>時:</text>
            <input type="text" id="hour" onchange="changeHour"></input>
            <text>分:</text>
            <input type="text" id="minute" onchange="changeMinute"></input>
            <div>
                <button class="button" value="設定" onclick="alarmClock"></button>
                <button class="button" value="取消" onclick="cancel"></button>
            </div>
        </form>
    </div>
</div>

           

主要js代碼如下:

通過不同的指令實作不同的調用。

//雙向綁定實作
    changeHour(event){
        this.hour=event.value;
    },
    changeMinute(event){
        this.minute=event.value
    },
    changeCountDown(event){
        this.countDown=event.value
    },  	
//鬧鐘類提醒
    alarmClock:function(){
        this.notification(0x1003);
    },
    //倒計時提醒
    alarmCountdown:function(){
        this.leftTime=0;//重置倒計時的讀秒
        this.leftTime=this.countDown;//同步倒計時讀秒
        this.notification(0x1002);
    },
    //取消提醒
    cancel:function(){
        this.notification(0x1001);
    },
    //初始化action資料
    initAction: function (code) {
        var actionData = {hour:this.hour,minute:this.minute,countDown:this.countDown};
        actionData.notify = "this actionData form JS ";
        var action = {};
        action.bundleName = "com.chinasoft.reminder";
        action.abilityName = "ReminderAbility";
        action.messageCode = code;
        action.data = actionData;
        action.abilityType = 1;
        action.syncOption = 0;
        return action;
    },
    //調用PA接口
    notification: async function(code) {
        try {
            var action = this.initAction(code);
            var result = await FeatureAbility.callAbility(action);
            this.showToast(result);
        } catch (pluginError) {
            console.error("startNotification : Plugin Error = " + pluginError);
        }
    },
           

3. 設定ReminderRequest類

3.1 設定通知插槽NotificationSlot

​ 這裡有個坑,需要手動設定手機的通知管理的通知鈴聲,打開震動才有震動效果,打開橫幅通知才有通知彈出效果。設定如下圖:

#夏日挑戰賽# HarmonyOS - 實作消息定時提醒

設定通知slot需要真實的手機才有震動效果,設定呼吸燈需要手機支援呼吸燈才有效果。

/*
     * 設定通知slot
     * */
    private NotificationSlot setSlot() {
        // 1. 設定管道資訊
        NotificationSlot slot = new NotificationSlot("slot_id", "slot_name", NotificationSlot.LEVEL_HIGH);
        slot.setDescription("slot_description");//設定NotificationSlot的描述資訊。
        slot.enableBypassDnd(true);//設定是否繞過系統的免打擾模式
        slot.setEnableLight(false);//設定收到通知時是否開啟呼吸燈,前提是目前硬體支援呼吸燈。
        slot.setEnableVibration(true);//設定收到通知時是否使能振動。
        slot.setLedLightColor(123456);
        return slot;
    }
	// 2. 向代理服務添加管道對象
   ReminderHelper.addNotificationSlot(setSlot());
           

3.2 建立提醒類對象

ReminderRequest分為3個子類:1.ReminderRequestTimer ,2.ReminderRequestCalendar ,3.ReminderRequestAlarm。

ReminderRequestTimer 對象建立

用于倒計時提醒,需要傳遞進一個倒計時的秒的參數。這個資料是從前端頁面傳過來的。

ReminderRequest reminderRequestTimer = new ReminderRequestTimer(countDown);
           

ReminderRequestAlarm對象建立

用于鬧鐘類提醒,需要傳遞時間資料。需要三個參數:int hour,int minute,int[] repeatDay

ReminderRequest reminder = new ReminderRequestAlarm(hour, minute, repeatDay);
           

3.3 設定提醒标題和内容

提醒是以通知形式來表現的。設定通知展示的标題和内容。

reminderRequestTimer.setTitle("倒計時").setContent("炸彈");      //設定标題和内容
           

3.4 設定提醒時長屬性

提醒預設提醒一次,如果需要提醒能長時間提醒,進行如下設定:

reminder.setRingDuration(10);//設定提醒時長
           

3.4 設定IntentAgent

需要設定BundleName和AbilityName。且AbilityName需要全類名(加上包名),才能實作頁面的跳轉。點選提醒彈出的通知就會跳轉到對應的頁面

reminder.setIntentAgent(BUNDLE_NAME, ABILITY_NAME);
           

3.5 設定延時提醒,功能按鈕

延時提醒和設定延時的時間,設定延時後提醒的次數。

當提醒時會發出通知,設定延遲提醒和關閉按鈕。

reminder.setSnoozeTimes(2)     //設定延遲提醒次數
        .setTimeInterval(1 * 60);//設定一分鐘,實際為5分鐘
reminder.setActionButton("延遲", ReminderRequest.ACTION_BUTTON_TYPE_SNOOZE)
                .setActionButton("關閉", ReminderRequest.ACTION_BUTTON_TYPE_CLOSE);
           

在這裡有一個坑:通過測試得,延遲提醒的最短時間為300s(5分鐘)如果設定時間小于300s則為預設的。

注意:對于倒計時提醒設定延遲提醒不起作用,隻有設定提醒時長有效。

3.6 釋出和取消提醒

釋出和取消提醒都是通過ReminderHelper這個類來完成的,取消提醒需要擷取釋出提醒後傳回的一個整型id來識别需要取消哪一個提醒。

int reminderId = ReminderHelper.publishReminder(reminder);//釋出提醒
           
ReminderHelper.cancelReminder(this.reminderId);//取消提醒
           

總結

對于提醒類ReminderRequest的3個子類來說,ReminderRequestTimer用于倒計時提醒,ReminderRequestAlarm用于鬧鐘類提醒,ReminderRequestCalendar類用于月曆類提醒。本項目還有月曆類提醒(ReminderRequestCalendar)的功能沒有實作,通過API可以發現其與鬧鐘類提醒的功能實作大緻一樣。在運用時需要注意其中的一些細節,才能正确使用。

更多原創内容請關注:中軟國際 HarmonyOS 技術團隊

入門到精通、技巧到案例,系統化分享HarmonyOS開發技術,歡迎投稿和訂閱,讓我們一起攜手前行共建鴻蒙生态。

繼續閱讀