[文章]HarmonyOS应用开发-FA调用PA能力学习分享

阅读量0
0
2
在鸿蒙开发中,页面交互时有时候需要调用后台PA的能力,比如数据获取、控制后台等,下面介绍如何做到上述情况。
相关接口:
FA端提供以下三个JS接口:
FeatureAbility.callAbility(OBJECT):调用PA能力。
FeatureAbility.subscribeAbilityEvent(OBJECT, Function):订阅PA能力。
FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消订阅PA能力。
PA端提供以下两类接口:
IRemoteObject.onRemoteRequest(int, MessageParcel, MessageParcel, MessageOption)Ability调用方式,FA使用远端进程通信拉起并请求PA服务。
AceInternalAbility.AceInternalAbilityHandler.onRemoteRequest(int, MessageParcel, MessageParcel, MessageOption)Internal Ability调用方式,采用内部函数调用的方式和FA进行通信。
使用演示:
FA
  1. // abilityType: 0-Ability; 1-Internal Ability
  2. const ABILITY_TYPE_EXTERNAL = 0;
  3. const ABILITY_TYPE_INTERNAL = 1;
  4. // syncOption(Optional, default sync): 0-Sync; 1-Async
  5. const ACTION_SYNC = 0;
  6. const ACTION_ASYNC = 1;
  7. const ACTION_MESSAGE_CODE_PLUS = 1001;
  8. export default {
  9.   plus: async function() {
  10.     var actionData = {};
  11.     actionData.firstNum = 1024;
  12.     actionData.secondNum = 2048;

  13.     var action = {};
  14.     action.bundleName = 'com.example.hiaceservice';
  15.     action.abilityName = 'com.example.hiaceservice.ComputeServiceAbility';
  16.     action.messageCode = ACTION_MESSAGE_CODE_PLUS;
  17.     action.data = actionData;
  18.     action.abilityType = ABILITY_TYPE_EXTERNAL;
  19.     action.syncOption = ACTION_SYNC;

  20.     var result = await FeatureAbility.callAbility(action);
  21.     var ret = JSON.parse(result);
  22.     if (ret.code == 0) {
  23.       console.info('plus result is:' + JSON.stringify(ret.abilityResult));
  24.     } else {
  25.       console.error('plus error code:' + JSON.stringify(ret.code));
  26.     }
  27.   }
  28. }
复制代码

PA:
  1. package com.example.hiaceservice;

  2. // ohos相关接口包
  3. import ohos.aafwk.ability.Ability;
  4. import ohos.aafwk.content.Intent;
  5. import ohos.hiviewdfx.HiLog;
  6. import ohos.hiviewdfx.HiLogLabel;
  7. import ohos.rpc.IRemoteBroker;
  8. import ohos.rpc.IRemoteObject;
  9. import ohos.rpc.RemoteObject;
  10. import ohos.rpc.MessageParcel;
  11. import ohos.rpc.MessageOption;
  12. import ohos.utils.zson.ZSONObject;

  13. import java.util.HashMap;
  14. import java.util.Map;

  15. public class ComputeServiceAbility extends Ability {
  16.   // 定义日志标签
  17.   private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0, "MY_TAG");

  18.   private MyRemote remote = new MyRemote();
  19.   // FA在请求PA服务时会调用Ability.connectAbility连接PA,连接成功后,需要在onConnect返回一个remote对象,供FA向PA发送消息
  20.   @Override
  21.   protected IRemoteObject onConnect(Intent intent) {
  22.     super.onConnect(intent);
  23.     return remote.asObject();
  24.   }
  25.   class MyRemote extends RemoteObject implements IRemoteBroker {
  26.     private static final int SUCCESS = 0;
  27.     private static final int ERROR = 1;
  28.     private static final int PLUS = 1001;   

  29.     MyRemote() {
  30.       super("MyService_MyRemote");
  31.     }

  32.     @Override
  33.     public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
  34.       switch (code) {
  35.         case PLUS: {
  36.           String dataStr = data.readString();
  37.           RequestParam param = new RequestParam();
  38.           try {   
  39.               param = ZSONObject.stringToClass(dataStr, RequestParam.class);
  40.           } catch (RuntimeException e) {   
  41.               HiLog.error(LABEL, "convert failed.");
  42.           }
  43.                     
  44.           // 返回结果当前仅支持String,对于复杂结构可以序列化为ZSON字符串上报
  45.           Map<String, Object> result = new HashMap<String, Object>();
  46.           result.put("code", SUCCESS);
  47.           result.put("abilityResult", param.getFirstNum() + param.getSecondNum());
  48.           reply.writeString(ZSONObject.toZSONString(result));
  49.           break;
  50.         }
  51.         default: {
  52.           Map<String, Object> result = new HashMap<String, Object>();
  53.           result.put("abilityError", ERROR);
  54.           reply.writeString(ZSONObject.toZSONString(result));
  55.           return false;
  56.         }
  57.       }
  58.       return true;
  59.     }

  60.     @Override
  61.     public IRemoteObject asObject() {
  62.       return this;
  63.     }
  64.   }
  65. }
复制代码

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友