#过年不停更#OpenHarmony 源码解析之SystemUi—Statusbar(TS) 原创 精华
春节不停更,此文正在参加「星光计划-春节更帖活动」
作者:董伟
简介
SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相关信息展示及交互界面,包括系统状态、系统提示、系统提醒等,例如系统时间、电量信息。
源码地址:https://gitee.com/openharmony/applications_systemui/tree/master
本文主要分析batterycomponent、clockcomponent、wificomponent三大组件:
- 导入batteryInfo模块,监听系统电池事件,实时获取电池电量状态
- 导入时间模块,调用JS内置函数,实时获取系统时间、日期、星期信息
- 导入Wifi模块,监听设备Wlan通信与连接事件,实时获取Wifi开关、供电、连接名等信息
发布-订阅模式
源码中灵活使用了发布-订阅模式(发布-订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知)来对battery和wifi事件进行监听,当页面初始化时定义订阅事件,页面取消初始化时定义退订事件,由此,当页面初始化时,即执行对事件的订阅与监听,页面初始化完成时,订阅监听的逻辑处理已完成并返回相应的结果。
在本文中以battery和wifi组件为例,将要监听的事件放在数组中,创建对该数组内事件的订阅来执行监听,订阅回调中设置该数组为data,监听到事件发生,触发事件回调,传入err和data参数,当err.code为0时(表示函数正常运行),对data进行判断,监听到对应的事件(即监听到battery或者wifi状态发生了变化),再通过调用相应模块下的方法来获取所需的数值,这样一来,电池和wifi的状态信息一有变化,便重新获取一次,就实现了对电池和wifi状态信息的实时获取。
相较于常规的回调函数,发布-订阅模式存在以下的优缺点:
优点:发布者与订阅者耦合性降低,发布者只管发布一条消息出去,它不关心这条消息如何被订阅者使用,同时,订阅者只监听发布者的事件名,只要发布者的事件名不变,它不管发布者如何改变。
缺点:1.创建订阅者需要消耗一定的时间和内存。
2.虽然可以弱化对象之间的联系,如果过度使用的话,反而使代码不好理解及代码不好维护等等。
架构图
目录
batterycomponent
简介
电池组件只需监听‘usual.event.BATTERY_CHANGED’即电池变化事件即可,监听到电池变化,便获取一次电池的状态信息,实时获取电池的状态信息(是否在充电,电量百分比),以实现以下功能:
1.自动在充电时展示更醒目的图标,比如填充绿色、带闪电等
2.动态展示电量百分比变化
官方接口文档
源码地址
https://gitee.com/nicklaus0602/applications_systemui/tree/master/features/batterycomponent
导入模块
申明变量与初始化
订阅与回调
获取电池状态、电量
Wificomponent
注:官方暂无WifiInfo模块的接口文档,只有“import wifi from ‘@ohos.wifi’”模块的相关文档,二者部分属性的枚举值相同,可以稍做参考。
wifi 模块地址:https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-wlan-0000001121342036
简介
wifi模块需要监听的事件较多,需要监听以下事件:
1.连接事件’usual.event.wifi.CONN_STATE’,
2.供电事件’usual.event.wifi.POWER_STATE’(常用于路由器等设备)
3.连接名事件’WIFI_CONNECT_NAME’,
通过监听wifi的连接状态变化来判断wifi的开关状态,通过监听wifi的供电状态变化来判断wifi是否可用,通过监听wifi连接的名称变化来判断当前连接的是哪一个wifi网络。
通过对这三个事件的监听,我们可以实时获取wifi的开关状态,供电状态,连接名称,借此可以实现以下功能:
1.自动根据wifi开关状态设置不同图标
2.自动展示连接的wifi名称
源码地址
https://gitee.com/openharmony/applications_systemui/tree/master/features/wificomponent
导入模块
申明变量与初始化
订阅与回调
通过创建对wifi事件的订阅,来监听mCommonEventSubscribeInfo中的三个事件,‘usual.event.wifi.CONN_STATE’,‘usual.event.wifi.POWER_STATE’,‘WIFI_CONNECT_NAME’,若事件发生,则触发回调,
获取Wifi状态
Clockcomponent
简介
对于系统时间的获取较为简单,只需在页面初始化时调用JS的内置函数来获取系统时间即可,需要注意的是因为要保持所展示的时间实时更新,需要使用以下函数来设置时间间隔,确保每隔一定的时间就调用一次函数,保证时间的实时更新。
本文中通过每隔3秒获取一次时间来展示系统时间,满足设备展示“xx:xx”即“小时-分钟“的需要,如果需要精度更高,就需要调整LOOP_TIME,使得调用函数的间隔更短。
源码地址
https://gitee.com/openharmony/applications_systemui/tree/master/features/clockcomponent
获取时间数据
结语
本文对源码的方法进行了细致的解读,目标是节省广大开发者分析源码的时间,希望大家阅读本文后,可以将源码中从订阅监听事件到调用方法获得枚举值的整个模块直接拿来使用,以此助力鸿蒙OS生态搭建!
更多原创内容请关注:开鸿 HarmonyOS 学院
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
看完之后深刻的认识到的做UI的不易
666
谢谢大佬支持
星星之火,可以燎原
不错呀
谢谢大佬支持 不妥之处欢迎指正
照着安卓画瓢,我希望有创意创新而不是给人只是安卓copy
大佬们好,小白怎么编译3.2release systemui