HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类
HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类
config.json
```json
{
"app": {
"bundleName": "work.yjzll.seesat10",
"vendor": "yjzll",
"version": {
"code": 1000000,
"name": "1.0.0"
}
},
"deviceConfig": {},
"module": {
"package": "work.yjzll.seesat10",
"name": ".MyApplication",
"mainAbility": "work.yjzll.seesat10.MainAbility",
"deviceType": [
"phone"
],
"distro": {
"deliveryWithInstall": true,
"moduleName": "entry",
"moduleType": "entry",
"installationFree": false
},
"abilities": [
{
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"visible": true,
"name": "work.yjzll.seesat10.MainAbility",
"icon": "$media:icon",
"description": "$string:mainability_description",
"label": "$string:entry_MainAbility",
"type": "page",
"launchType": "standard"
}
],
"js": [
{
"pages": [
"pages/index/index",
"pages/JsAceInternalAbility/JsAceInternalAbility"
],
"name": "default",
"window": {
"designWidth": 720,
"autoDesignWidth": true
}
}
]
}
}
JsAceInternalAbility.js
```javascript
import router from '@system.router';
import prompt from '@system.prompt';
const ABILITY_TYPE_EXTERNAL = 0;
const ABILITY_TYPE_INTERNAL = 1; // 选用0
const ACTION_SYNC = 0;
const ACTION_ASYNC = 1;
const ACTION_GET = 1001;
const SUBSCRIBE_EVENT = 1002;
const UNSUBSCRIBE_EVENT = 1003;
var mylongitude = 123.4;
var mylatitude = 11.1;
export default {
data: {
title: 'World',
userdata02: "",
},
onInit(){},
toindexback(){
router.back();
},
onKey(keyevent){
if (keyevent.code == 20){
// 遥控器按下键=20,动作
}
},
getAction: async function (){
console.info('03B00 回调前,经纬度:' + mylongitude+" "+mylatitude);
var actionData = {};
actionData.firstNum = mylongitude; //顺序一致! 格式相对应!
actionData.secondNum = mylatitude; //顺序一致! 格式相对应!
var action = {};
action.bundleName = 'work.yjzll.seesat10';
action.abilityName = 'JsCallJavaAceInternalAbility';
action.messageCode = ACTION_GET; // 需要PA端约定一致
action.data = actionData; //发送到 Ability 的数据,数据字段名称需要PA端约定。只有 FeatureAbility.callAbility 接口有
action.abilityType = ABILITY_TYPE_INTERNAL; // 0:Ability調用方式 // 1:Internal Ability調用方式
action.syncOption = ACTION_ASYNC; // 0:同步方式,默认方式 // 1:异步方式
var result = await FeatureAbility.callAbility(action);
var ret = JSON.parse(result);
if (ret.code == 0) {
mylongitude = JSON.stringify(ret.abilityResult1); //名称和数据类型,要与myLocationAbility.java中的一致
mylatitude = JSON.stringify(ret.abilityResult2); //名称和数据类型,要与myLocationAbility.java中的一致
console.info('03B00 回调结果,经纬度:' + mylongitude+" "+mylatitude);
} else {
console.error('03B00 回调结果,错误码:' + JSON.stringify(ret.code));
}
},
initAction: function (code) {
var actionData = {};
var action = {};
action.bundleName = 'work.yjzll.seesat10';
action.abilityName = 'JsCallJavaAceInternalAbility';
action.messageCode = code;
action.data = actionData;
action.abilityType = ABILITY_TYPE_INTERNAL; // 0:Ability調用方式 // 1:Internal Ability調用方式
action.syncOption = ACTION_ASYNC; // 0:同步方式,默认方式 // 1:异步方式
return action;
},
mySubscribe: async function () {
try {
var action = this.initAction(SUBSCRIBE_EVENT);
var that = this;
var result = await FeatureAbility.subscribeAbilityEvent(action,function (resultFunc) {
var resultData = JSON.parse(resultFunc).data;
console.info("03B00 2 返回第一个参数: " + resultData.msg1);
console.info("03B00 3 返回第二个参数: " + resultData.msg2);
});
console.info("03B00 订阅公共事件 结果 = " + result);
} catch (pluginError) {
console.error("03B00 订阅公共事件 错误 ,结果 = " + result + JSON.stringify(pluginError));
}
},
myUnSubscribe: async function () {
try {
var action = this.initAction(UNSUBSCRIBE_EVENT);
var result = await FeatureAbility.unsubscribeAbilityEvent(action);
FeatureAbility.callAbility(action);
console.info("03B00 退订公共事件 : " + result);
} catch (pluginError) {
console.error("03B00 退订公共事件错误 : " + JSON.stringify(pluginError));
}
},
showToast:function(msg){
prompt.showToast({
message: msg,
duration: 1000,
});
}
}
JsCallJavaAceInternalAbility.java
```java
package work.yjzll.seesat10;
import ohos.ace.ability.AceInternalAbility;
import ohos.event.commonevent.*;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.rpc.IRemoteObject;
import ohos.rpc.MessageOption;
import ohos.rpc.MessageParcel;
import ohos.rpc.RemoteException;
import ohos.utils.zson.ZSONObject;
import java.util.HashMap;
import java.util.Map;
public class JsCallJavaAceInternalAbility extends AceInternalAbility {
private static final int ACTION_GET = 1001; // JS端发送的业务请求编码,与本PA端的定义保持一致
private static final int SUBSCRIBE_EVENT = 1002;
private static final int UNSUBSCRIBE_EVENT = 1003;
private static final int SUCCESS = 0;
private static final int ERROR = 1;
private static final int DEFAULT_TYPE = 0;
private static final String BUNDLE_NAME = "work.yjzll.seesat10";
private static final String ABILITY_NAME = "JsCallJavaAceInternalAbility";
private static JsCallJavaAceInternalAbility instance;
private CommonEventSubscriber subscriber;
private static final String TAG = JsCallJavaAceInternalAbility.class.getSimpleName();
private static final HiLogLabel LABEL_LOG =
new HiLogLabel(HiLog.LOG_APP, 0xD003B00, TAG);
double num1, num2;
private JsCallJavaAceInternalAbility() {
super(BUNDLE_NAME, ABILITY_NAME);
}
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
switch (code) {
case ACTION_GET: {
String dataStr = data.readString();
RequestParamEvent param;
try {
param = ZSONObject.stringToClass(dataStr, RequestParamEvent.class);
num1 = param.getFirstNum() + 10;
num2 = param.getSecondNum() + 10;
HiLog.info(LABEL_LOG, "加10返回结果,第一个数:" + num1 + " 第二个数:" + num2);
} catch (RuntimeException e) {
HiLog.info(LABEL_LOG, "传入失败");
}
Map<String, Object> result = new HashMap<>();
result.put("code", SUCCESS);
result.put("abilityResult1", num1);
result.put("abilityResult2", num2);
if (option.getFlags() == MessageOption.TF_SYNC) {
reply.writeString(ZSONObject.toZSONString(result));
} else {
MessageParcel responseData = MessageParcel.obtain();
responseData.writeString(ZSONObject.toZSONString(result));
IRemoteObject remoteReply = reply.readRemoteObject();
try {
remoteReply.sendRequest(SUCCESS, responseData, MessageParcel.obtain(), new MessageOption());
} catch (RemoteException exception) {
return false;
} finally {
responseData.reclaim();
}
}
break;
}
case SUBSCRIBE_EVENT: {
subscribeEvent(data, reply, option);
break;
}
case UNSUBSCRIBE_EVENT: {
unSubscribeEvent(reply);
break;
}
default: {
Map<String, Object> result = new HashMap<>();
result.put("FA调用PA错误", ERROR);
reply.writeString(ZSONObject.toZSONString(result));
return false;
}
}
return true;
}
private void subscribeEvent(MessageParcel data, MessageParcel reply, MessageOption option) {
MatchingSkills matchingSkills = new MatchingSkills();
matchingSkills.addEvent(CommonEventSupport.COMMON_EVENT_BATTERY_CHANGED);
IRemoteObject notifier = data.readRemoteObject();
CommonEventSubscribeInfo subscribeInfo = new CommonEventSubscribeInfo(matchingSkills);
subscriber = new CommonEventSubscriber(subscribeInfo) {
[@Override](/user/Override)
public void onReceiveEvent(CommonEventData commonEventData) {
replyMsg(notifier);
}
};
if (option.getFlags() == MessageOption.TF_SYNC) {
reply.writeString("订阅公共事件成功--同步");
}
try {
CommonEventManager.subscribeCommonEvent(subscriber);
reply.writeString(" 订阅公共事件成功--异步");
} catch (RemoteException e) {
HiLog.info(LABEL_LOG, "订阅公共事件--异步--意外抛出 RemoteException");
}
}
private void replyMsg(IRemoteObject notifier) {
MessageParcel notifyData = MessageParcel.obtain();
String stringBuilder = "{\"" +
"msg1\":\"" + num1 + "\",\"" +
"msg2\":\"" + num2 + "\"}";
notifyData.writeString(stringBuilder);
try {
notifier.sendRequest(DEFAULT_TYPE, notifyData, MessageParcel.obtain(), new MessageOption());
} catch (RemoteException exception) {
HiLog.info(LABEL_LOG, "replyMsg 抛出异常");
} finally {
notifyData.reclaim();
}
}
private void unSubscribeEvent(MessageParcel reply) {
try {
CommonEventManager.unsubscribeCommonEvent(subscriber);
reply.writeString("退订公共事件成功");
} catch (RemoteException | IllegalArgumentException exception) {
reply.writeString("退订公共事件失败");
}
subscriber = null;
}
public static JsCallJavaAceInternalAbility getInstance() {
if (instance == null) {
synchronized (JsCallJavaAceInternalAbility.class) {
if (instance == null) {
instance = new JsCallJavaAceInternalAbility();
}
}
}
return instance;
}
public void register() {
this.setInternalAbilityHandler(this::onRemoteRequest);
}
public void deregister() {
this.setInternalAbilityHandler(null);
}
}
RequestParamEvent.java
```java
package work.yjzll.seesat10;
public class RequestParamEvent {
private double firstNum;
private double secondNum;
public double getFirstNum() {
return firstNum;
}
public void setFirstNum(double firstNum) {
this.firstNum = firstNum;
}
public double getSecondNum() {
return secondNum;
}
public void setSecondNum(double secondNum) {
this.secondNum = secondNum;
}
}
MainAbility.java
```java
package work.yjzll.seesat10;
import ohos.ace.ability.AceAbility;
import ohos.aafwk.content.Intent;
public class MainAbility extends AceAbility {
[@Override](/user/Override)
public void onStart(Intent intent) {
JsCallJavaAceInternalAbility.getInstance().register();
super.onStart(intent);
}
[@Override](/user/Override)
public void onStop() {
super.onStop();
JsCallJavaAceInternalAbility.getInstance().deregister();
}
}
更多关于HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类的实战教程也可以访问 https://www.itying.com/category-93-b0.html
给楼主点赞
更多关于HarmonyOS 鸿蒙Next Js 调用 Java ,AceInternalAbility类的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)系统中,Next.js(一个基于React的JavaScript框架)通常用于前端开发,而Java主要用于后端或服务层开发。在鸿蒙系统中直接通过Next.js调用Java代码并不常见,因为这两者是不同技术栈中的组件,分别运行在前端和后端。
特别是提到的AceInternalAbility
类,这似乎是鸿蒙系统中一个特定于后端的组件或API,通常不会直接从前端JavaScript框架中调用。前端与后端的交互一般通过HTTP请求、WebSocket或其他网络通信技术实现。
如果你需要在鸿蒙应用的前端(Next.js)与后端(Java)之间进行交互,建议的做法是:
- 在Java后端设置一个API接口,用于处理来自前端的请求。
- 在Next.js前端通过fetch或axios等库发送HTTP请求到Java后端。
- Java后端处理请求并返回响应,前端接收并处理响应。
确保前后端之间的通信遵循RESTful原则或GraphQL等规范,以保持接口的清晰和易于维护。
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html