
基于ArkTS语言的OpenHarmony APP应用开发:公共事件的订阅和发布 原创
1、程序介绍
本示例主要展示了公共事件相关的功能,实现了一个检测用户部分行为的应用。
具体而言,本案例实现了如下几个公共事件功能:
- 通过订阅系统公共事件,实现对用户操作行为(亮灭屏、断联网)的监测;
- 通过在用户主动停止监测行为时发布自定义有序公共事件,实现对用户主动触发监听行为的持久化记录;
- 通过在用户设置对某一事件的监听状态时发布粘性事件,记录下本次应用运行期间允许监听的事件列表,同时在应用退出时将临时允许的修改为不允许。
具体而言,本案例实现如下几个界面:
- 进入应用显示菜单页,可选择“进入”,“历史”,“设置”及“关于”几个选项。
- 点击“进入”后跳转至主页面,点击主页面“开始监控”按钮,将开始监听系统公共事件,并进行计时,此时按钮内容变更为“停止监听”;点击停止监听按钮,页面上将显示本次监听时长及监听期间收到的干扰信息汇总,并在页面右下角显示“查看详情”按钮,点击按钮将跳转至详情页,显示监听期间收到的干扰信息,应用当前仅监听了亮灭屏、断联网等用户可操作的系统公共事件,后续可根据需求快速扩展。
- 返回至应用菜单页面,点击“历史”可查看用户操作监听的历史记录,当前支持每次运行期间最多存储20条历史记录,超过20条后将删除历史数据。
- 返回至应用菜单页面,点击“设置”可进行具体系统事件的监听配置,应用提供了“一直”、“仅本次”及“从不”三个选项,其中“仅本次”选项是指本次应用运行期间将监听特定系统公共事件,应用退出后该选项将自动调整为“从不”。
- 返回值应用菜单页面,点击“关于”可查看应用版本信息及本示例的说明。
本案例已在OpenHarmony凌蒙派-RK3568开发板验证通过,具体代码可参考:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/d05_CustomCommonEvent
API接口:9
2、知识准备
2.1、commonEvent模块
OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。
公共事件从系统角度可分为:系统公共事件和自定义公共事件。
-
系统公共事件:CES内部定义的公共事件,只有系统应用和系统服务才能发布,例如HAP安装,更新,卸载等公共事件。目前支持的系统公共事件详见系统公共事件列表。
-
自定义公共事件:应用自定义一些公共事件用来实现跨进程的事件通信能力。
公共事件按发送方式可分为:无序公共事件、有序公共事件和粘性公共事件。
-
无序公共事件:CES转发公共事件时,不考虑订阅者是否接收到,按订阅者订阅先后顺序转发。
-
有序公共事件:CES转发公共事件时,按订阅者订阅先后顺序,在接收到前一个订阅者回复后,再转发下一个订阅者。
-
粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅。发送粘性事件必须是系统应用或系统服务,且需要申请
ohos.permission.COMMONEVENT_STICKY
权限。
每个应用都可以按需订阅公共事件,订阅成功,当公共事件发布时,系统会将其发送给对应的应用。这些公共事件可能来自系统、其他应用和应用自身。
2.1.1、引入commonEvent模块
2.1.2、commonEvent函数
其中,参数定义如下:
- publish:发送公共事件,event 表示事件名称。
- publishAsUser:发送指定用户的公共事件。
- createSubscriber:创建事件的订阅者。
- subscribe:订阅事件,可以是公共事件,也可以是自定义事件。
- unsubscribe:取消订阅事件,一旦取消,后续对的事件将不再接收。
2.1.3、创建订阅者
以异步方法构造CommonEventSubscriber对象,创建公共事件订阅者对象,使用callback形式返回。
其中,参数定义如下:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
subscribeInfo | CommonEventSubscribeInfo | 是 | 公共事件订阅者信息 |
callback | AsyncCallback | 是 | 事件监听回调函数,当收到订阅的事件时,回调订阅的事件数据 |
2.1.4、开启订阅事件
以异步方法订阅公共事件,使用callback形式返回。在调用subscriber接口订阅公共事件前,需要先通过createSubscriber接口创建一个CommonEventSubscriber对象。
其中,参数定义如下:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
subscribeInfo | CommonEventSubscribeInfo | 是 | 公共事件订阅者信息 |
callback | AsyncCallback | 是 | 事件监听回调函数,当收到订阅的事件时,回调订阅的事件数据 |
2.1.5、取消订阅事件
以异步方法取消订阅公共事件,使用callback形式返回。与subscribe接口相同,需要传入一个已创建的CommonEventSubscriber对象。
其中,参数定义如下:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
subscribeInfo | CommonEventSubscribeInfo | 是 | 公共事件订阅者信息 |
callback | AsyncCallback | 否 | 事件监听回调函数,当收到订阅的事件时,回调订阅的事件数据 |
2.1.6、发布事件
以callback形式发布公共事件。
其中,参数定义如下:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
subscribeInfo | CommonEventSubscribeInfo | 是 | 公共事件订阅者信息 |
callback | AsyncCallback | 是 | 事件监听回调函数,当收到订阅的事件时,回调订阅的事件数据 |
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,用于负责具体的公共事件订阅以及页面间跳转。
注意:feature具体事务可参考entry/src/main/ets/feature/LaunchFeature.ts
。
其次,编辑页面显示界面。
再次,创建LauchFeatrue.ts,主要负责页面跳转和记录公共事件记录。
其中,负责页面跳转的代码如下所示:
其中,记录公共事件记录的代码如下所示:
最后,定义onPageShow()
,在用户浏览页面时触发该事件。
3.2、Main.ets
首先,定义一个实际负责main页面逻辑操作的类对象。
其次,在build()中定义按键画面。
再次,this.executeCallBack()
根据btnState
数值变化开启或关闭公共事件监听。
再次,定义handleStart()
开启公共事件监听。
最后,定义handleStop()
关闭公共事件监听。
4、项目编译
4.1、打开项目
打开DevEco Studio,再打开自定义通知项目。
4.2、编译程序
点击菜单栏上的“Build” -> “Rebuild Project”。如果出现无法编译,则注意查看Event Log界面。如下所示:
点击Run 'npm install'
,让DevEco Studio安装相关依赖包。
重新点击菜单栏上的“Build” -> “Rebuild Project”。出现如下错误:
点击上图红色框部分,安装相关服务。
重新点击菜单栏上的“Build” -> “Rebuild Project”,编译成功。
4.3、安装程序
点击“entry”按钮,将项目程序安装到设备端。如下图所示:
如果出现下述报错,表示无法安装。如图所示:
点击上图红色框的蓝色字体,弹出"Project Structure"对话框,点击"Apply",再点击"OK"。如图所示:
重新点击“entry”按钮,将项目程序安装到设备端。
5、运行结果
运行结果如下所示
