色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于ArkTS語言的OpenHarmony APP應用開發:公共事件的訂閱和發布

福州市凌睿智捷電子有限公司 ? 2024-09-19 08:05 ? 次閱讀

1、程序介紹

本示例主要展示了公共事件相關的功能,實現了一個檢測用戶部分行為的應用。

具體而言,本案例實現了如下幾個公共事件功能:

通過訂閱系統公共事件,實現對用戶操作行為(亮滅屏、斷聯網)的監測;

通過在用戶主動停止監測行為時發布自定義有序公共事件,實現對用戶主動觸發監聽行為的持久化記錄;

通過在用戶設置對某一事件的監聽狀態時發布粘性事件,記錄下本次應用運行期間允許監聽的事件列表,同時在應用退出時將臨時允許的修改為不允許。

具體而言,本案例實現如下幾個界面:

進入應用顯示菜單頁,可選擇“進入”,“歷史”,“設置”及“關于”幾個選項。

點擊“進入”后跳轉至主頁面,點擊主頁面“開始監控”按鈕,將開始監聽系統公共事件,并進行計時,此時按鈕內容變更為“停止監聽”;點擊停止監聽按鈕,頁面上將顯示本次監聽時長及監聽期間收到的干擾信息匯總,并在頁面右下角顯示“查看詳情”按鈕,點擊按鈕將跳轉至詳情頁,顯示監聽期間收到的干擾信息,應用當前僅監聽了亮滅屏、斷聯網等用戶可操作的系統公共事件,后續可根據需求快速擴展。

返回至應用菜單頁面,點擊“歷史”可查看用戶操作監聽的歷史記錄,當前支持每次運行期間最多存儲20條歷史記錄,超過20條后將刪除歷史數據。

返回至應用菜單頁面,點擊“設置”可進行具體系統事件的監聽配置,應用提供了“一直”、“僅本次”及“從不”三個選項,其中“僅本次”選項是指本次應用運行期間將監聽特定系統公共事件,應用退出后該選項將自動調整為“從不”。

返回值應用菜單頁面,點擊“關于”可查看應用版本信息及本示例的說明。

本案例已在OpenHarmony凌蒙派-RK3568開發板驗證通過

API接口:9

2、知識準備

2.1、commonEvent模塊

OpenHarmony通過CES(Common Event Service,公共事件服務)為應用程序提供訂閱、發布、退訂公共事件的能力。

公共事件從系統角度可分為:系統公共事件和自定義公共事件。

系統公共事件:CES內部定義的公共事件,只有系統應用和系統服務才能發布,例如HAP安裝,更新,卸載等公共事件。目前支持的系統公共事件詳見系統公共事件列表。

自定義公共事件:應用自定義一些公共事件用來實現跨進程的事件通信能力。

公共事件按發送方式可分為:無序公共事件、有序公共事件和粘性公共事件。

無序公共事件:CES轉發公共事件時,不考慮訂閱者是否接收到,按訂閱者訂閱先后順序轉發。

有序公共事件:CES轉發公共事件時,按訂閱者訂閱先后順序,在接收到前一個訂閱者回復后,再轉發下一個訂閱者。

粘性公共事件:能夠讓訂閱者收到在訂閱前已經發送的公共事件就是粘性公共事件。普通的公共事件只能在訂閱后發送才能收到,而粘性公共事件的特殊性就是可以先發送后訂閱。發送粘性事件必須是系統應用或系統服務,且需要申請ohos.permission.COMMONEVENT_STICKY權限。

每個應用都可以按需訂閱公共事件,訂閱成功,當公共事件發布時,系統會將其發送給對應的應用。這些公共事件可能來自系統、其他應用和應用自身。

2.1.1、引入commonEvent模塊

import commonEvent from '@ohos.commonEvent';

2.1.2、commonEvent函數

declare namespace commonEvent {
function publish(event: string, callback: AsyncCallback<void>): void;
function publish(event: string, options: CommonEventPublishData, callback: AsyncCallback<void>): void;
function publishAsUser(event: string, userId: number, callback: AsyncCallback<void>): void;
function publishAsUser(event: string, userId: number, options: CommonEventPublishData, callback: AsyncCallback<void>): void;
function createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback<CommonEventSubscriber>): void;
function createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise<CommonEventSubscriber>;
function subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback<CommonEventData>): void;
function unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback<void>): void;
}

其中,參數定義如下:

publish:發送公共事件,event 表示事件名稱。

publishAsUser:發送指定用戶的公共事件。

createSubscriber:創建事件的訂閱者。

subscribe:訂閱事件,可以是公共事件,也可以是自定義事件。

unsubscribe:取消訂閱事件,一旦取消,后續對的事件將不再接收。

2.1.3、創建訂閱者

function createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback<CommonEventSubscriber>): void;
function createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise<CommonEventSubscriber>;

以異步方法構造CommonEventSubscriber對象,創建公共事件訂閱者對象,使用callback形式返回。

其中,參數定義如下:

參數名類型必填說明
subscribeInfoCommonEventSubscribeInfo公共事件訂閱者信息
callbackAsyncCallback事件監聽回調函數,當收到訂閱的事件時,回調訂閱的事件數據

2.1.4、開啟訂閱事件

function subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback<CommonEventData>): void;

以異步方法訂閱公共事件,使用callback形式返回。在調用subscriber接口訂閱公共事件前,需要先通過createSubscriber接口創建一個CommonEventSubscriber對象。

其中,參數定義如下:

參數名類型必填說明
subscribeInfoCommonEventSubscribeInfo公共事件訂閱者信息
callbackAsyncCallback事件監聽回調函數,當收到訂閱的事件時,回調訂閱的事件數據

2.1.5、取消訂閱事件

function unsubscribe(subscriber: CommonEventSubscriber, callback?: AsyncCallback<void>): void;

以異步方法取消訂閱公共事件,使用callback形式返回。與subscribe接口相同,需要傳入一個已創建的CommonEventSubscriber對象。

其中,參數定義如下:

參數名類型必填說明
subscribeInfoCommonEventSubscribeInfo公共事件訂閱者信息
callbackAsyncCallback事件監聽回調函數,當收到訂閱的事件時,回調訂閱的事件數據

2.1.6、發布事件

function publish(event: string, callback: AsyncCallback<void>): void;
function publish(event: string, options: CommonEventPublishData, callback: AsyncCallback<void>): void;
function publishAsUser(event: string, userId: number, callback: AsyncCallback<void>): void;
function publishAsUser(event: string, userId: number, options: CommonEventPublishData, callback: AsyncCallback<void>): void;

以callback形式發布公共事件。

其中,參數定義如下:

參數名類型必填說明
subscribeInfoCommonEventSubscribeInfo公共事件訂閱者信息
callbackAsyncCallback事件監聽回調函數,當收到訂閱的事件時,回調訂閱的事件數據

3、程序解析

按照頁面劃分,本案例大致可分為如下幾個頁面:

(1)Launch.ets:應用顯示菜單頁面。進入應用顯示菜單頁,可選擇“進入”,“歷史”,“設置”及“關于”幾個選項。

(2)Main.ets:主頁面。顯示“進入監控”按鍵,“開始監控”按鈕,將開始監聽系統公共事件,并進行計時,此時按鈕內容變更為“停止監聽”;點擊停止監聽按鈕,頁面上將顯示本次監聽時長及監聽期間收到的干擾信息匯總,并在頁面右下角顯示“查看詳情”按鈕,點擊按鈕將跳轉至詳情頁,顯示監聽期間收到的干擾信息,應用當前僅監聽了亮滅屏、斷聯網等用戶可操作的系統公共事件,后續可根據需求快速擴展。

(3)History.ets:歷史頁面。可查看用戶操作監聽的歷史記錄,當前支持每次運行期間最多存儲20條歷史記錄,超過20條后將刪除歷史數據。

(4)Setting.ets:設置頁面。可進行具體系統事件的監聽配置,應用提供了“一直”、“僅本次”及“從不”三個選項,其中“僅本次”選項是指本次應用運行期間將監聽特定系統公共事件,應用退出后該選項將自動調整為“從不”。

(5)Detail.ets:查看詳情頁面。可負責查看當前監控的具體信息。供Main.ets調用。

(6)About.ets:關于頁面。顯示軟件信息。

3.1、Launch.ets

首先,定義一個私有變量feature,用于負責具體的公共事件訂閱以及頁面間跳轉。

private feature :launchFeature = new launchFeature(getContext() as context.UIAbilityContext)

注意:feature具體事務可參考entry/src/main/ets/feature/LaunchFeature.ts。

其次,編輯頁面顯示界面。

build() {
Column() {
Image($rawfile('jumpToStart.png'))
.objectFit(ImageFit.Contain)
.width(160)
.height(75)
.onClick(this.feature.jumpToStart)
.position({ x: '30%', y: '20%' })
Image($rawfile('jumpToHistory.png'))
.objectFit(ImageFit.Contain)
.width(160)
.height(75)
.onClick(this.feature.jumpToHistory)
.position({ x: '30%', y: '35%' })
Image($rawfile('jumpTosetting.png'))
.objectFit(ImageFit.Contain)
.width(160)
.height(75)
.onClick(this.feature.jumpToSetting)
.position({ x: '30%', y: '50%' })
Image($rawfile('jumpAbout.png'))
.objectFit(ImageFit.Contain)
.width(160)
.height(75)
.onClick(this.feature.jumpToAbout)
.position({ x: '30%', y: '65%' })
}
.backgroundImage($rawfile('vbg720.png'))
.backgroundImageSize(ImageSize.Contain)
.width('100%')
.height('100%')
}

再次,創建LauchFeatrue.ts,主要負責頁面跳轉和記錄公共事件記錄。

其中,負責頁面跳轉的代碼如下所示:

jumpToHistory = () => {
Logger.info("ready to jump to history page")
router.push({
url: 'pages/History',
params: {}
})
}

jumpToSetting = () => {
Logger.info("ready to jump to setting page")
router.push({
url: 'pages/Setting',
params: {}
})
}
......

其中,記錄公共事件記錄的代碼如下所示:

private callbackFunc = (error, event) => {
this.pref.has(consts.DATA_BASE_KEY_TOTAL_TIMES, (err, ret) => {
if (ret) {
this.pref.get(consts.DATA_BASE_KEY_TOTAL_TIMES, []).then((value) => {
this.insertRecord(event, value)
})
} else {
let value: Array<string> = []
this.insertRecord(event, value)
}
})
if (this.currentRecordTimes >= consts.MAX_RECORD_NUM) {
this.subscriber.finishCommonEvent()
return
}
this.subscriber.abortCommonEvent()
this.subscriber.finishCommonEvent()
this.currentRecordTimes++
}

private callbackLowFunc = (error, event) => {
this.currentRecordTimes = 0
this.pref.get(consts.DATA_BASE_KEY_TOTAL_TIMES, []).then((value: Array<string>) => {
for (let i = 0; i < consts.MAX_RECORD_NUM; i++) {
this.pref.delete(value[i]).then(() => {
this.pref.flush()
})
}
})
this.currentRecordTimes = 0;
}

最后,定義onPageShow(),在用戶瀏覽頁面時觸發該事件。

async onPageShow() {
await this.feature.init()
}

3.2、Main.ets

首先,定義一個實際負責main頁面邏輯操作的類對象。

private feature:mainFeature = new mainFeature()

其次,在build()中定義按鍵畫面。

Image(this.btnSrc)
.objectFit(ImageFit.Contain).size({ width: 320, height: 150 })
.onClick(this.executeCallBack)

再次,this.executeCallBack()根據btnState數值變化開啟或關閉公共事件監聽。

private executeCallBack = () => {
if (!this.btnState) {
this.handleStart()
} else {
this.handleStop()
}
}

再次,定義handleStart()開啟公共事件監聽。

private handleStart = () => {
this.btnState = true
this.btnSrc = $rawfile('stop.png')
this.detailState = Visibility.None
this.currentState = Visibility.Visible
this.totalEventsInString = ''
this.totalEvents = 0
this.totalTimeInString = ''
// 獲取系統時間
sysTime.getCurrentTime().then((curTime) => {
this.startTime = curTime
let subscriberInfo = {
events: this.feature.getCurrentValidEvents()
}
// 創建訂閱者
commonEvent.createSubscriber(subscriberInfo, (error, subscriber) => {
this.validEventsSubscriber = subscriber
// 開啟訂閱事件
commonEvent.subscribe(subscriber, this.systemEventCallback)
})
})
}

最后,定義handleStop()關閉公共事件監聽。

private handleStop = () => {
this.btnState = false
this.btnSrc = $rawfile('start.png')
this.detailState = Visibility.Visible
this.currentState = Visibility.None
this.totalEventsInString = this.totalEvents.toString()
// 刷新時間
sysTime.getCurrentTime().then((curTime) => {
this.totalTimeInString = utils.convertTimeToFormatString(curTime - this.startTime)
// 取消訂閱事件
commonEvent.unsubscribe(this.validEventsSubscriber, () => {
Logger.info("unsubscribe called")
})
let options = {
isOrdered: true,
parameters: {
'startTime': utils.getLocaleTime(this.startTime),
'endTime': utils.getLocaleTime(curTime),
'totalTime': this.totalTimeInString,
'totalEvents': this.totalEventsInString,
}
}
// 發布公共事件
commonEvent.publish(consts.COMMON_EVENT_FINISH_MEDITATION, options, () => {
Logger.info("success to publish COMMON_EVENT_FINISH_MEDITATION")
})
})
}

4、項目編譯

4.1、打開項目

打開DevEco Studio,再打開自定義通知項目。

4.2、編譯程序

點擊菜單欄上的“Build” -> "Rebuild Project"。如果出現無法編譯,則注意查看Event Log界面。如下所示:

d591e662-761a-11ef-bb4b-92fbcf53809c.png

點擊Run 'npm install',讓DevEco Studio安裝相關依賴包。

重新點擊菜單欄上的“Build” -> "Rebuild Project"。出現如下錯誤:

d5ad6414-761a-11ef-bb4b-92fbcf53809c.png

點擊上圖紅色框部分,安裝相關服務。

重新點擊菜單欄上的“Build” -> "Rebuild Project",編譯成功。

d5c75f90-761a-11ef-bb4b-92fbcf53809c.png

4.3、安裝程序

點擊“entry”按鈕,將項目程序安裝到設備端。如下圖所示:

d5ea4b22-761a-11ef-bb4b-92fbcf53809c.png

如果出現下述報錯,表示無法安裝。如圖所示:

d5fe24b2-761a-11ef-bb4b-92fbcf53809c.png

點擊上圖紅色框的藍色字體,彈出"Project Structure"對話框,點擊"Apply",再點擊"OK"。如圖所示:

d6212e12-761a-11ef-bb4b-92fbcf53809c.png

重新點擊“entry”按鈕,將項目程序安裝到設備端。

d63d6762-761a-11ef-bb4b-92fbcf53809c.png

5、運行結果

運行結果如下所示

d650d4b4-761a-11ef-bb4b-92fbcf53809c.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • APP
    APP
    +關注

    關注

    33

    文章

    1573

    瀏覽量

    72439
  • 應用開發
    +關注

    關注

    0

    文章

    58

    瀏覽量

    9357
  • OpenHarmony
    +關注

    關注

    25

    文章

    3713

    瀏覽量

    16254
收藏 人收藏

    評論

    相關推薦

    HarmonyOS開發實例:【事件的訂閱發布

    公共事件相關的功能,實現了一個檢測用戶部分行為的應用。
    的頭像 發表于 04-15 17:36 ?1037次閱讀
    HarmonyOS<b class='flag-5'>開發</b>實例:【事件的<b class='flag-5'>訂閱</b>和<b class='flag-5'>發布</b>】

    基于ArkTS語言OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介 該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。 本案例是基于API 9接口開發。 本案例已在OpenHarmony凌蒙派-
    發表于 09-14 12:47

    基于ArkTS語言OpenHarmony APP應用開發:自定義通知

    OpenHarmony凌蒙派-RK3568開發板驗證通過,具體代碼可參考:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony
    發表于 09-14 15:12

    基于ArkTS語言OpenHarmony APP應用開發公共事件的訂閱發布

    監聽特定系統公共事件,應用退出后該選項將自動調整為“從不”。 返回值應用菜單頁面,點擊“關于”可查看應用版本信息及本示例的說明。 本案例已在OpenHarmony凌蒙派-RK3568開發板驗證通過
    發表于 09-18 13:16

    HarmonyOS應用開發-公共事件處理

    開發過程中service想要控制多個ability時,可以考慮使用公共事件處理。發布無序的公共事件: //發布
    發表于 11-02 15:15

    HUAWEI DevEco Studio 3.1版本發布,配套ArkTS聲明式開發全面升級

    構建產物。 3)新增支持ArkTS/JS與C/C++跨語言調試特性,在C/C++工程中,采用ArkTS/JS與C/C++進行混合開發,能夠在ArkT
    發表于 11-17 11:52

    HarmonyOS/OpenHarmony應用開發-Stage模型ArkTS語言AbilityConstant

    狀態。APP_RECOVERY1應用恢復保存狀態。接口示例:*附件:HarmonyOSOpenHarmony應用開發-stage模型ArkTS語言
    發表于 04-03 09:15

    HarmonyOS/OpenHarmony應用開發-Stage模型ArkTS語言AbilityStage

    進行初始化時回調。context接口示例:*附件:HarmonyOSOpenHarmony應用開發-stage模型ArkTS語言AbilityStage.docx
    發表于 04-07 15:16

    HarmonyOS/OpenHarmony應用開發-Stage模型ArkTS語言擴展能力基類

    \'@ohos.app.ability.ExtensionAbility\'; 接口示例: *附件:HarmonyOSOpenHarmony應用開發-stage模型ArkTS
    發表于 04-26 10:00

    HarmonyOS/OpenHarmony應用開發-ArkTS語言基本語法說明

    的封裝和復用UI描述。 @Extend/@Style:擴展內置組件和封裝屬性樣式,更靈活地組合內置組件。 stateStyles:多態樣式,可以依據組件的內部狀態的不同,設置不同樣式。*附件:HarmonyOSOpenHarmony應用開發-
    發表于 06-01 10:25

    HarmonyOS/OpenHarmony應用開發-ArkTS語言聲明式UI描述

    (100) . Button(\'click +1\') ..onClick(() => { .console.info(\'+1 clicked!\'); .}) .} .} *附件:HarmonyOSOpenHarmony應用開發-
    發表于 06-05 15:26

    HarmonyOS優選主力應用開發語言-ArkTS概述

    ArkTS是HarmonyOS優選的主力應用開發語言。ArkTS圍繞應用開發在TypeScript(簡稱TS)生態基礎上做了進一步擴展,繼承
    發表于 06-09 10:52

    OpenHarmony ArkTS工程目錄結構(Stage模型)

    一、應用工程結構 圖片來源:OpenHarmony官網 AppScope > app.json5:應用的全局配置信息。 entry:OpenHarmony工程模塊,編譯構建生成一個
    發表于 09-18 15:23

    OpenHarmony 應用開發SDK、API 與基礎工具

    一、整體說明 ArkTS 語言是鴻蒙系統主推的應用開發語言。因此鴻蒙系統提供給開發者的 API 絕大部分也是
    發表于 09-19 15:45

    基于ArkTS語言OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統編寫的UI應用類:HelloOpenHarmony。本案例是基于API9接口開發。本案例已在OpenHarmony凌蒙派-RK35
    的頭像 發表于 09-15 08:09 ?371次閱讀
    基于<b class='flag-5'>ArkTS</b><b class='flag-5'>語言</b>的<b class='flag-5'>OpenHarmony</b> <b class='flag-5'>APP</b>應用<b class='flag-5'>開發</b>:Hello<b class='flag-5'>Openharmony</b>
    主站蜘蛛池模板: 99久久精品互换人妻AV| 国产成人mv 在线播放| 国产成人小视频| 久久超碰国产精品最新| 欧美精品专区免费观看| 亚洲高清无在码在线电影| 18日本人XXXXXX18| 国产精品久久毛片A片软件爽爽| 久久黄色免费网站| 色橹橹欧美在线观看视频高| 亚洲熟伦熟女专区| 暗卫受被肉到失禁各种PLAY| 花蝴蝶在线观看中字| 秋霞电影网伦大理电影在线观看| 亚洲精品卡2卡3卡4卡5卡区 | 欧美日韩精品一区二区三区四区| 素人约啪第五季| 5g天天奭视频| 国产一区二区青青精品久久| 牛和人交videos欧美| 亚洲精品午夜VA久久成人| 成人毛片100部免费看| 久久久久999| 迅雷哥在线观看高清| ass女人下部欣赏| 久久高清免费视频| 天天影视网网色色欲| av56788成 人影院| 久久日本片精品AAAAA国产| 四虎永久免费网址| 边摸边吃奶玩乳尖视频| 久久精品国产久精国产果冻传媒| 乌克兰14一18处交见血| jizzjizz3d动漫| 久久精品在现线观看免费15| 小处雏一区二区三区| 草久久久久| 女人高潮特级毛片| 在线观看成人3d动漫入口| 国产午夜精品久久久久婷婷| 日韩免费一区|