W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
JS UI 框架提供了 JS FA(Feature Ability)調(diào)用 Java PA(Particle Ability)的機(jī)制,該機(jī)制提供了一種通道來(lái)傳遞方法調(diào)用、數(shù)據(jù)返回以及訂閱事件上報(bào)。
當(dāng)前提供 Ability 和 Internal Ability 兩種調(diào)用方式,開發(fā)者可以根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的調(diào)用方式進(jìn)行開發(fā)。
JS 端與 Java 端通過(guò) bundleName 和 abilityName 來(lái)進(jìn)行關(guān)聯(lián)。在系統(tǒng)收到 JS 調(diào)用請(qǐng)求后,根據(jù)開發(fā)者在 JS 接口中設(shè)置的參數(shù)來(lái)選擇對(duì)應(yīng)的處理方式。開發(fā)者在 onRemoteRequest() 中實(shí)現(xiàn) PA 提供的業(yè)務(wù)邏輯。詳細(xì)信息請(qǐng)參考 JS FA調(diào)用Java PA機(jī)制。
FA 端提供以下三個(gè) JS 接口:
PA 端提供以下兩類接口:
返回該錯(cuò)誤說(shuō)明 JS 接口調(diào)用請(qǐng)求未在系統(tǒng)中找到對(duì)應(yīng)的 InternalAbilityHandler 進(jìn)行處理,因此需要檢查以下幾點(diǎn)是否正確執(zhí)行:
Ability 和 Internal Ability 是兩種不同的 FA 調(diào)用 PA 的方式。 [表1]列舉了在開發(fā)時(shí)各方面的差異,供開發(fā)者參考,避免開發(fā)時(shí)將兩者混淆使用:
差異項(xiàng) | Ability | InternalAbility |
---|---|---|
JS端(abilityType) | 0 | 1 |
是否需要在 config.json 的 abilities 中為 PA 添加聲明 | 需要(有獨(dú)立的生命周期) | 不需要(和FA共生命周期) |
是否需要在FA中注冊(cè) | 不需要 | 需要 |
繼承的類 | ohos.aafwk.ability.Ability | ohos.ace.ability.AceInternalAbility |
是否允許被其他FA訪問(wèn)調(diào)用 | 是 | 否 |
// abilityType: 0-Ability; 1-Internal Ability
const ABILITY_TYPE_EXTERNAL = 0;
const ABILITY_TYPE_INTERNAL = 1;
// syncOption(Optional, default sync): 0-Sync; 1-Async
const ACTION_SYNC = 0;
const ACTION_ASYNC = 1;
const ACTION_MESSAGE_CODE_PLUS = 1001;
export default {
plus: async function() {
var actionData = {};
actionData.firstNum = 1024;
actionData.secondNum = 2048;
var action = {};
action.bundleName = 'com.huawei.hiaceservice';
action.abilityName = 'CalcServiceAbility';
action.messageCode = ACTION_MESSAGE_CODE_PLUS;
action.data = actionData;
action.abilityType = ABILITY_TYPE_EXTERNAL;
action.syncOption = ACTION_SYNC;
var result = await FeatureAbility.callAbility(action);
var ret = JSON.parse(result);
if (ret.code && ret.code == 0) {
console.info('plus result is:' + JSON.stringify(ret.abilityResult));
} else {
if (ret.code) {
console.error('plus error code:' + JSON.stringify(ret.code));
} else {
console.error('plus error undefined.');
}
}
}
}
功能代碼實(shí)現(xiàn):
CalcServiceAbility.java
// ohos相關(guān)接口包
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.rpc.IRemoteBroker;
import ohos.rpc.IRemoteObject;
import ohos.rpc.RemoteObject;
import ohos.rpc.MessageParcel;
import ohos.rpc.MessageOption;
import ohos.utils.zson.ZSONObject;
import java.util.HashMap;
import java.util.Map;
public class CalcServiceAbility extends Ability {
private static final String TAG = "CalcServiceAbility";
private MyRemote remote = new MyRemote();
// FA在請(qǐng)求PA服務(wù)時(shí)會(huì)調(diào)用AbilityconnectAbility連接PA,連接成功后,需要在onConnect返回一個(gè)remote對(duì)象,供FA向PA發(fā)送消息
@Override
protected IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
return remote.asObject();
}
class MyRemote extends RemoteObject implements IRemoteBroker {
private static final int ERROR = -1;
private static final int SUCCESS = 0;
private static final int PLUS = 1001;
MyRemote() {
super("MyService_MyRemote");
}
@Override
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
switch (code) {
case PLUS: {
String zsonStr = data.readString();
RequestParam param = ZSONObject.stringToClass(zsonStr, RequestParam.class);
// 返回結(jié)果僅支持可序列化的Object類型
Map<String, Object> zsonResult = new HashMap<String, Object>();
zsonResult.put("code", SUCCESS);
zsonResult.put("abilityResult", param.getFirstNum() + param.getSecondNum());
reply.writeString(ZSONObject.toZSONString(zsonResult));
break;
}
default: {
Map<String, Object> zsonResult = new HashMap<String, Object>();
zsonResult.put("abilityError", ERROR);
reply.writeString(ZSONObject.toZSONString(zsonResult));
return false;
}
}
return true;
}
@Override
public IRemoteObject asObject() {
return this;
}
}
}
請(qǐng)求參數(shù)代碼:
RequestParam.java
public class RequestParam {
private int firstNum;
private int secondNum;
public int getFirstNum() {
return firstNum;
}
public void setFirstNum(int firstNum) {
this.firstNum = firstNum;
}
public int getSecondNum() {
return secondNum;
}
public void setSecondNum(int secondNum) {
this.secondNum = secondNum;
}
}
功能代碼實(shí)現(xiàn):
CalcInternalAbility.java
// ohos相關(guān)接口包
import ohos.ace.ability.AceInternalAbility;
import ohos.app.AbilityContext;
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 CalcInternalAbility extends AceInternalAbility {
private static final String TAG = CalcInternalAbility.class.getSimpleName();
private static final String BUNDLE_NAME = "com.huawei.hiaceservice";
private static final String ABILITY_NAME = "CalcInternalAbility";
private static final int ERROR = -1;
private static final int SUCCESS = 0;
private static final int PLUS = 1001;
private static CalcInternalAbility instance;
private AbilityContext abilityContext;
// 如果多個(gè)Ability實(shí)例都需要注冊(cè)當(dāng)前InternalAbility實(shí)例,需要更改構(gòu)造函數(shù),設(shè)定自己的bundleName和abilityName
public CalcInternalAbility() {
super(BUNDLE_NAME, ABILITY_NAME);
}
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
switch (code) {
case PLUS: {
String zsonStr = data.readString();
RequestParam param = ZSONObject.stringToClass(zsonStr, RequestParam.class);
// 返回結(jié)果當(dāng)前僅支持String,對(duì)于復(fù)雜結(jié)構(gòu)可以序列化為ZSON字符串上報(bào)
Map<String, Object> zsonResult = new HashMap<String, Object>();
zsonResult.put("code", SUCCESS);
zsonResult.put("abilityResult", param.getFirstNum() + param.getSecondNum());
// SYNC
if (option.getFlags() == MessageOption.TF_SYNC) {
reply.writeString(ZSONObject.toZSONString(zsonResult));
} else {
// ASYNC
MessageParcel reponseData = MessageParcel.obtain();
reponseData.writeString(ZSONObject.toZSONString(zsonResult));
IRemoteObject remoteReply = reply.readRemoteObject();
try {
remoteReply.sendRequest(0, reponseData, MessageParcel.obtain(), new MessageOption());
reponseData.reclaim();
} catch (RemoteException exception) {
return false;
}
}
break;
}
default: {
Map<String, Object> zsonResult = new HashMap<String, Object>();
zsonResult.put("abilityError", ERROR);
reply.writeString(ZSONObject.toZSONString(zsonResult));
return false;
}
}
return true;
}
/**
* Internal ability registration.
*/
public static void register(AbilityContext abilityContext) {
instance = new CalcInternalAbility();
instance.onRegister(abilityContext);
}
private void onRegister(AbilityContext abilityContext) {
this.abilityContext = abilityContext;
this.setInternalAbilityHandler((code, data, reply, option) -> {
return this.onRemoteRequest(code, data, reply, option);
});
}
/**
* Internal ability deregistration.
*/
public static void deregister() {
instance.onDeregister();
}
private void onDeregister() {
abilityContext = null;
this.setInternalAbilityHandler(null);
}
}
Internal Ability 注冊(cè):修改繼承 AceAbility 工程中的代碼
public class HiAceInternalAbility extends AceAbility {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
// 注冊(cè)
CalcInternalAbility.register(this);
...
}
@Override
public void onStop() {
// 去注冊(cè)
CalcInternalAbility.deregister();
super.onStop();
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: