HarmonyOS学习路之开发篇—Java UI框架(使用工具自动生成JS FA调用PA代码)

简介: JS FA(Feature Ability)调用PA (Particle Ability)是使用基于JS扩展的类Web开发范式的方舟开发框架所提供的一种跨语言能力调用的机制,用于建立JS能力与Java能力之间传递方法调用、处理数据返回以及订阅事件上报的通道。开发者可以使用FA调用PA机制进行应用开发,但直接使用该机制需要开发者手动撰写大量模板代码,且模板代码可能与业务代码相互耦合,使得代码可维护性和可读性较差。

JS FA(Feature Ability)调用PA (Particle Ability)是使用基于JS扩展的类Web开发范式的方舟开发框架所提供的一种跨语言能力调用的机制,用于建立JS能力与Java能力之间传递方法调用、处理数据返回以及订阅事件上报的通道。开发者可以使用FA调用PA机制进行应用开发,但直接使用该机制需要开发者手动撰写大量模板代码,且模板代码可能与业务代码相互耦合,使得代码可维护性和可读性较差。


想要提升开发效率,开发者可以在DevEco Studio环境中借助js2java-codegen工具自动生成JS FA调用PA代码(目前仅支持InternalAbility调用方式),快速完成FA调用PA应用的开发。开发者只需添加简单的配置与标注即可利用该工具完成大部分FA调用PA模板代码的编写,同时也有效地将业务代码与模板代码相互分离,使代码具有更好的可维护性与可读性。


说明


关于JS FA调用PA的详细介绍,请参考JS FA如何调用PA。


js2java-codegen工具简介

js2java-codegen是工具链提供的自动生成JS FA调用PA代码的辅助开发工具。它可以根据用户源码生成FA调用PA所需的、与用户编写的业务代码相互分离的模板代码。


js2java-codegen工具所支持的FA调用PA实现方式为InternalAbility类型,目前尚不支持Ability类型。开发者完成设置后只需编写包含实际业务逻辑的InternalAbility类和需要注册的Ability类,并在InternalAbility类中加上对应注解,js2java-codegen即可在编译过程中完成FA调用PA通道的建立。之后,开发者只需在JS侧调用由js2java-codegen工具生成的JS接口即可调用Java一侧的能力。


js2java-codegen工具所生成的模板代码包含Java代码和JS代码。其中Java代码会被直接编译成字节码文件,并且对应Ability类中会被自动添加注册与反注册语句,开发者无需关注;而JS代码则需要用户手动调用,因此开发者需要在编译前设置好JS代码的输出路径。


从HarmonyOS SDK中Toolchains的2.2.0.3版本开始支持该功能。


注解使用说明

js2java-codegen工具通过注解来获取信息并生成开发者所需的代码。因此用户如果想使用该工具辅助开发,则需要了解以下三种注解的用法。


@InternalAbility注解

类注解,用于被使用作InternalAbility的、包含实际业务代码的类(简称InternalAbility类)。只支持文件中public的顶层类,不支持接口类和注解类。


包含一个参数:registerTo,值为需要注册到的Ability类全名。具体用例可见Java侧代码编写部分。


用例如下,代表Service类是一个InternalAbility类,注册到位于com.example包中的、名为Ability的Ability类。

@InternalAbility(registerTo = "com.example.Ability")
public class Service{}

@ExportIgnore注解

方法注解,用于InternalAbility类中的某些方法,表示该方法不暴露给JS侧来调用。仅对public方法有效。


用例如下,代表service方法不会被暴露给JS侧。


@ExportIgnore
public int service(int input) {
    return input;
}

@ContextInject注解

用于AbilityContext上的注解。该类由HarmonyOS的Java API提供,开发者可通过它获取API中提供的信息。


用例如下,代表开发者可以借助abilityContext对象获取API中提供的信息。


@ContextInject
AbilityContext abilityContext;

新建工程

想要体验工具生成模板代码的功能,可使用DevEco Studio新建一个包含JS前端的简单手机项目,并用其开发一个简单的FA调用PA应用。



a3b9ba81e3dccc9e47f50c8bbcc3af3f.png

工具开关与编译设置

在需要进行代码生成的模块下的build.gradle中控制开关和进行编译设置。想要快速验证功能,可选择修改entry模块的build.gradle,通过entry模块进行验证。


编译参数位于ohos -> defaultConfig中,只需添加如下设置即可。开发者需在此处设置JS模板代码生成路径,即'jsOutputDir'对应的值。


// 在文件头部定义JS模板代码生成路径
def jsOutputDir = project.file("src/main/js/default/generated").toString()
// 在ohos -> defaultConfig中设置JS模板代码生成路径
javaCompileOptions {
    annotationProcessorOptions {
        arguments = ["jsOutputDir": jsOutputDir] // JS模板代码生成赋值
    }
}

工具开关位于ohos中,只需添加如下设置即可。值设为true则启用工具,false或不进行配置则不启用工具。

compileOptions {
    f2pautogenEnabled true // 此处为启用js2java-codegen工具的开关
}

Java侧代码编写

模板代码的生成需要开发者提供用于FA调用的PA,因此开发者需要自己编写InternalAbility类,然后在类上加@InternalAbility注解,registerTo参数设为想要注册到的Ability类的全称。(Ability类可使用项目中已有的MainAbility类,或创建新的Ability类)


注意,InternalAbility类中需要暴露给FA来调用的方法只能是public类型的非静态非void方法,如若不是则不会被暴露。


一个简单的InternalAbility类实现如下,文件名为Service.java,与MainAbility类同包,用注解注册到MainAbility类。类里面包含一个add方法作为暴露给JS FA来调用的能力,实现了两数相加的功能,入参为两个int参数,返回值为两数的和。


package com.example.myapplication;
import ohos.annotation.f2pautogen.InternalAbility;
@InternalAbility(registerTo = "com.example.myapplication.MainAbility") // 此处registerTo的参数为项目中MainAbility类的全称
public class Service {
    public int add(int num1, int num2) {
        return num1 + num2;
    }
}

编译

js2java-codegen工具在编译过程中会自动被调用,自动生成模板代码并完成整个通道建立的过程。


点击菜单栏中的Build -> Build HAP(s)/APP(s) -> Build HAP(s),即可完成对项目的编译,同时js2java-codegen工具会在编译过程中完成FA调用PA通道的建立。


编译过程会生成Java和JS的模板代码。其中JS的模板代码位于开发者在编译设置中设置的路径,名称与InternalAbility类的名称相对应;而Java的模板代码位于entry > build > generated > source > annotation > debug > InternalAbility类同名包 > InternalAbility类名+Stub.java,而该类的调用语句会被注入到MainAbility类的字节码当中。以下两图为生成的模板代码示例。


Java模板代码示例



JS模板代码示例



JS侧代码编写

为了简易直观地检验工具生成的代码的可用性,开发者可以通过修改entry > src > main > js > default > pages > index > index.js来调用Java侧的能力并在前端页面展示效果。


可通过import方式引入JS侧FA接口,例如import Service from '../../generated/Service.js';(from后的值需要与编译设置中的路径进行统一。生成的JS代码文件名及类名与InternalAbility类名相同。)


一个简单的index.js页面实现如下,调用了JS侧接口,传入了1和10两个参数,并把返回的结果打印在title中,这样只要运行该应用就可以验证FA调用PA是否成功。


import Service from '../../generated/Service.js'; // 此处FA路径和类名对应之前的jsOutput路径以及InternalAbility的名字
export default {
    data: {
        title: "Result:"
    },
    onInit() {
        const echo = new Service(); // 此处新建FA实例
        echo.add(1,10)
            .then((data) => {
            this.title += data["abilityResult"]; // 此处取到运算结果,并加到title之后
        });
    }
}

为了方便结果展示,这里对同目录下的index.hml也做一点修改,让页面中只显示title的内容。


<div class="container">
    <text class="title">
        {{ title }}
    </text>
</div>

结果验证

启动手机模拟器,启动成功后运行应用,看到如下显示则说明js2java-codegen工具生成了有效的模板代码,成功地建立起了FA调用PA的通道。


模拟器验证效果


42c824c21a65596a421ea29a24227834.png

相关文章
|
5天前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
55 2
|
7天前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
77 3
|
8天前
|
Java
怎么用Java 代码示例来展示继承的实现
本文通过Java代码示例展示继承机制:Animal为父类,Cat和Dog继承其属性与方法,并实现构造函数调用、方法重写与特有功能扩展,体现代码复用与多态特性。
47 4
|
5天前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
|
5月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
167 15
|
5月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
152 11
|
16天前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
138 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
4月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
178 56
|
4月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
211 55
|
8月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
396 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章