本文主要是介绍harmony next 服务卡片实时刷新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
此前今日事鸿蒙版卡片数据刷新还是有点问题。
问题:
安装应用后把卡片放到桌面,在app内新增一条数据,服务卡片不刷新,需要把app进程删除重新打开,才能正常刷新数据。
原因:
卡片渲染在系统进程,创建和调用都是系统触发,即EntryFormAbility里的代码其实运行在系统进程里面,跟app进程有内存隔离。没法做到数据实时共享。
懒得上图了,卡片交互流程直接上官网看吧。
这里主要解决问题。
需要通过harmony提供的跨进程通信模块
import commonEventManager from '@ohos.commonEventManager'
来把卡片id发给app内进行保存,才能保证在app内能实时拿到卡片id,才能保证数据能刷新到卡片上。
核心代码:
import commonEventManager from '@ohos.commonEventManager'class SubscriberClass {event_form_id = "form_id"publishCount: number = 1subscriber?: commonEventManager.CommonEventSubscriber// 发布者publish(eventType: string ,data:string){// next中data支持导入类型commonEventManager.publish(eventType,{data},(err)=>{if(err){// 失败只发3次if(this.publishCount<=3){this.publishCount++this.publish(eventType,data)}else{this.publishCount = 1}}else{this.publishCount = 1}})}// 订阅者subscribe(eventType: string, callback:(event?: string)=>void){commonEventManager.createSubscriber({ events: [eventType] }, (err, sub) => {if (err) {return console.log('logData:', `创建订阅者error ${JSON.stringify(err)}`)}this.subscriber = subif (this.subscriber !== null) {//订阅事件commonEventManager.subscribe(this.subscriber, (err, data) => {if (err) {return console.error(`logData`, '订阅事件失败')}callback(data.data)})} else {console.error('logData:',`需要创建subscriber`);}})}
}export default new SubscriberClass()
这里简单构造了一个跨进程通信的发布与订阅的对象,在卡片EntryFormAbility调用publish,把formId发布出来。在App的EntryAbility中subscribe数据。
在EntryFormAbility的onAddForm中:
SubscriberClass.publish(SubscriberClass.event_form_id, formId)
在EntryAbility的onWindowStateCreate中:
SubscriberClass.subscribe(SubscriberClass.event_form_id, (data?: string) => {if (data) {CardManager.get().saveCardId(this.context, data)}})
这样,才能确保在APP中任意位置能更新到卡片:
CardManager.get().updateCard()
多说无益,直接看源码吧:
这篇关于harmony next 服务卡片实时刷新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!