【鸿蒙】桌面卡片开发教程:从底层原理开始讲透call事件的刷新机制 “坚果派-咸鱼”

坚果派由坚果创建,团队拥有 12 个华为 HDE,以及若干其他领域的三十余位万粉博主运营。
团队成员聚集在北京,上海,南京,深圳,广州,宁夏等地,欢迎合作。

首先铺垫两个基础知识:

1.为什么桌面卡片需要使用特殊机制来刷新?

主要有两个原因:第一是 OpenHarmonyOS Api9 的桌面卡片出于降低系统能耗的目的,被限制了只有 5 秒的活动时间。超过 5 秒以后桌面卡片的相关进程会被强制销毁,变成一个静态的页面。只有通过 router 机制、call 机制或者 message 机制拉起相关后台,才能再次进行卡片内容的刷新。

第二个原因是从实际的运行机制来说,桌面卡片实际上并不是应用主体的一部分,而是归属于 OpenHarmony 系统中的桌面应用所管理的一系列服务,桌面卡片与其对应的应用主体之间相互隔离,只能使用专门的接口来进行数据交互与页面管理。

每张卡片都有一个独立的 LocalStorage 可以用来存储页面级变量,但同一个 LocalStorage 的数据只能在 UIAbility 内部共享,对外隔离,UIAbility 无法直接访问。

桌面卡片刷新机制的本质就是通过专门的接口,改变特定桌面卡片的 LocalStorage 参数。以实现桌面卡片的 UI 更新。

2.router 机制、call 机制与 message 机制有什么不同?

这三个机制都可以用来刷新桌面卡片的,三种机制的数据都以 JSON 的格式进行配置,并使用**formBindingData.createFormBindingData()**函数构建数据对象。

主要区别在于:

router 机制会直接打开应用界面,效果有点像点击桌面图标。也可以带参数打开应用,直接进入应用内部的某个特定位置,或者触发某项功能。

call 机制是不打开应用界面,仅在后台拉起应用主体的 UIAbility,来执行 UIAbility 内部的相关代码。call 机制不受 5 秒时长的限制,可以先实现复杂且费时的数据加载,再提供给桌面卡片进行刷新。

message 机制则不涉及到应用的 UIAbility,只是拉起桌面卡片自己的 FormAbility,也可以刷新卡片,但仍然受 5 秒时长的限制,更适合轻量化的的实现卡片内容的刷新。

接下来进入正式讲解:

本案例使用 call 机制,通过拉起应用主体的方式来刷新卡片内容。

使用 call 机制刷新卡片的全流程主要分为 3 个阶段:

1.通过卡片的 postCardAction 接口触发 call 事件 →

2.call 事件拉起应用主体的后台,进行数据准备,通过 updateForm 接口执行刷新事件 →

3.卡片 page 页面接收到数据,更新卡片界面。

由于卡片与应用主体是独立运作的,并且一个应用可能会有多个应用卡片,应用其实并不知到是哪个卡片触发了 call 事件,所以我们需要把卡片 id 作为参数一起写入接口,让卡片的管理方能找到我们要刷新的卡片。

补全以后的全流程如下:

1.(卡片创建时)FormAbility 获取卡片的 FormID,将其作为参数交给卡片页面储存 →
2.卡片页面初始化自己的 FromID
3.(点击刷新时)卡片通过 postCardAction 接口触发 call 事件,将卡片的 FormID 与要执行的函数名 method 都作为参数提交,由系统启动对应应用的 UIAbility→
4.UIAbility 启动成功,通过预置的触发器执行 method 对应的函数,完成数据准备后通过 updateForm 接口将数据推送给卡片管理方 →
5.对应 FormID 的卡片检测并同步到数据变动,完成页面变更。

案例代码:

1.卡片创建时 FormAbility 获取 FormID,并交给卡片页面

import formBindingData from '@ohos.app.form.formBindingData'; 
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';

export default class EntryFormAbility extends FormExtensionAbility {
   
  onAddForm(want) {
   //创建卡片时产生的want中包含FormID,需要再此处读取出来同步给LocalStorage。
   let formId = want.parameters["ohos.extra.param.key.form_identity"];
   let dataObj1 = {
   
     "formId": formId
   };
   let obj1 = formBindingData.createFormBindingData(dataObj1);
   return obj1;
 }
};


2.卡片页面初始化自己的 FromID

let storage = new LocalStorage();
@Entry(storage)
@Component
struct WidgetCard {
   
  @LocalStorageProp('formId') formId: string = '0';//在Form页面中使用@LocalStorageProp来进行FromID变量的初始化
}


3.卡片通过 postCardAction 接口触发 call 事件,让系统拉起应用后台的 pageAbility

let storage = new LocalStorage();
@Entry(storage)
@Component
struct WidgetCard {
   
  @LocalStorageProp ("formId") @Watch('firstF
  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值