ArkTS开发系列之ExtensionAbility的学习(2.1.2 上)

上篇回顾 ArkTS开发系列之UIAbility的学习(2.1.1)

本篇内容 ExtensionAbility组件相关知识内容的学习(上)

一、知识储备

1. ExtensionAbility

① 定义:ExtensionAbility组件是基于特定场景提供的应用组件,以便满足更多的使用场景; 每个具体场景对应一个ExtensionAbilityType,均由相应的系统服务统一管理,比如InputMethodExtensionAbility组件由输入法管理服务统一管理。
②类型: 当前支持FromExtensionAbility 和 WorkSchecdulerExtensionAbility两大类型
  • form类型的组件,用于提供服务怎么场景相关能力
  • work_scheduler类型组件,用于提供延迟任务的注册、注销、查询的能力

2. 服务卡片

① 定义:说白了,就是Hap应用的精简版,以卡片的形式,存在于桌面之前。
② 功能:支持拉起页面、发送消息等基础交互能力

3. ArkTS卡片的原理

① 原理、优势和限制

在这里插入图片描述
在这里插入图片描述

  • 卡片使用方:显示卡片内容的宿主应用,当前仅系统应用可以作为卡片使用方
  • 卡片提供方:提供卡片显示内容的应用。
  • 卡片管理服务:用于管理系统中所添加卡片的常驻代理服务,提供formProvider接口能力,同时提供卡片对象的管理与使用以及卡片 周期性刷新等能力
  • 卡片渲染服务:用于管理卡片渲染实例,渲染实例与卡片使用方上的卡片组件一一绑定。卡片渲染服务运行卡片页面代码widgets.abc进行渲染,并将渲染后的数据发送至卡片使用方对应的卡片组件。
  • 运行原理:ArkTS卡片支持在卡片中运行逻辑代码,新增了卡片渲染服务用于运行卡片页面代码widgets.abc,卡片渲染服务由卡片管理服务管理。同一应用提供方的渲染实例隔离在同一个虚拟机运行环境中。开发过程中需要注意globalThis对象的使用。同一应用提供方的卡片global对象是同一个。
② 优势
  • 统一开发范式,提升开发体验和开发效率
  • 新增了动效的能力(属性动画和显式动画)
  • 允许卡片中运行逻辑代码。拓宽了卡片的业务适用场景
③ 约束
  • 不支持加载so
  • 不支持使用native语言开发
  • 仅支持声明式范式的部分组件、事件、动效、数据管理、状态管理和api能力
  • 卡片的事件处理和使用方的事件处理是独立,建议在使用方支持左右滑动的场景下,卡片内容不要使用左右滑动功能的组件,以防止手势冲突
  • 暂不支持导入模块
  • 暂不支持极速预览
  • 暂不支持断点调试能力
  • 暂不支持HotReload热重载

4. ArkTS卡片的相关模块的定义

① FormExtensionAbility相关
  • FormExtensionAbility: 卡片扩展模块,提供卡片创建、销毁、刷新等生命周期回调
  • FormExtensionContext:FormExtensionAbility的上下文环境,提供FormExtensionAbility具有的能力
  • formProvider:提供卡片提供方相关的接口能力
  • formInfo:提供了卡片信息和状态等相关类型和枚举
  • formBindingData:提供卡片数据绑定的能力,包括FormBindingData对象的创建、相关信息的描述
② 页面布局(Card.ets) 提供声明式范式的ui接口能力
  • ArkTs卡片特有能力:postCardAction用于卡片内部和提供方应用间的交互,仅在卡片中可以调用
  • ArkTS卡片能力列表:能在arkTs卡片中使用的api、组件、事件、属性和生命周期调度
③ 卡片配置 包含在FormExtensionAbility的配置和卡片的配置
  • 在module.json5配置文件中的extensionAbilities标签下,配置FormExtensionAbility相关信息
  • 在resources/base/profile/目录下的form_config.json配置文件中,配置卡片(widgetCard.ets)相关信息

5. 开始开发第一个卡片服务

① 创建一个卡片

在这里插入图片描述

② 配置卡片的配置
  • 卡片需要在module.json5配置文件中的extensionAbilities标签下,配置FormExtensionAbility相关信息。
{
  "module": {
  ....//  配置信息不用担心,工程创建卡片的时候会自动生成基本配置信息
  "extensionAbilities": [
      {
        "name": "EntryFormAbility",
        "srcEntry": "./ets/entryformability/EntryFormAbility.ts",
        "label": "$string:EntryFormAbility_label",
        "description": "$string:EntryFormAbility_desc",
        "type": "form",
        "metadata": [
          {
            "name": "ohos.extension.form",
            "resource": "$profile:form_config"
          }
        ]
      }
    ]
  }
}
  • 卡片的具体配置信息,resources/base/profile/目录下的form_config.json作为卡片profile配置文件
{ //  同样不用担心:配置信息不用担心,工程创建卡片的时候会自动生成基本配置信息
  "forms": [
    {
      "name": "first_widget",
      "description": "This is my first a service widget.",
      "src": "./ets/first_widget/pages/First_widgetCard.ets",
      "uiSyntax": "arkts",
      "window": {
        "designWidth": 720,
        "autoDesignWidth": true
      },
      "colorMode": "auto",
      "isDefault": true,
      "updateEnabled": false,
      "scheduledUpdateTime": "10:30",
      "updateDuration": 1,
      "defaultDimension": "2*2",
      "supportDimensions": [
        "2*2"
      ]
    }
  ]
}
③ 卡片的生命周期函数
import formInfo from '@ohos.app.form.formInfo';
import formBindingData from '@ohos.app.form.formBindingData';
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import formProvider from '@ohos.app.form.formProvider';

export default class EntryFormAbility extends FormExtensionAbility {
  onAddForm(want) {
    // Called to return a FormBindingData object.
    let formData = {};
    return formBindingData.createFormBindingData(formData);
  }

  onCastToNormalForm(formId) {
    // 使用方将临时卡片转换为常态卡片触发,提供方需要做相应的处理
    console.info(`[EntryFormAbility] onCastToNormalForm, formId: ${formId}`);
  }

  onUpdateForm(formId) {
    // 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能,则提供方需要重写该方法以支持数据更新
    console.info('[EntryFormAbility] onUpdateForm');
    let obj = {
      'title': 'titleOnUpdateForm',
      'detail': 'detailOnUpdateForm'
    };
    let formData = formBindingData.createFormBindingData(obj);
    formProvider.updateForm(formId, formData).catch((err) => {
      if (err) {
        // 异常分支打印
        console.error(`[EntryFormAbility] Failed to updateForm. Code: ${err.code}, message: ${err.message}`);
        return;
      }
    });
  }

  onChangeFormVisibility(newStatus) {
    // 需要配置formVisibleNotify为true,且为系统应用才会回调
    console.info('[EntryFormAbility] onChangeFormVisibility');
  }

  onFormEvent(formId, message) {
    // 若卡片支持触发事件,则需要重写该方法并实现对事件的触发
    console.info('[EntryFormAbility] onFormEvent');
  }

  onRemoveForm(formId) {
    // 当对应的卡片删除时触发的回调,入参是被删除的卡片ID.
    console.info('[EntryFormAbility] onRemoveForm');
  }

  onConfigurationUpdate(config) {
    // 当系统配置信息置更新时触发的回调
    console.info('[EntryFormAbility] configurationUpdate:' + JSON.stringify(config));
  }

  onAcquireFormState(want) {
    // 卡片提供方接收查询卡片状态通知接口,默认返回卡片初始状态。
    return formInfo.FormState.READY;
  }
};

二、效果一览

三、源码分析讲解

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值