ArkUI eTS PA计算十二生肖[Service Ability] 原创 精华

狼哥Army
发布于 2022-7-7 18:45
浏览
2收藏

@toc

1. 前言

上一篇ArkUI eTS 计算十二生肖 是直接在eTS计算出生肖的,这篇文章是通过PA(Service Ability)来计算生肖的,UI是一样的,计算方式不同,通过此文章可以学习到eTS如何调用Java Ability,返回JSON字符串结果,显示到eTS上,由于预览器不支持调用PA, 所以这里使用的是远程模拟器P40 Pro 来开发测试.

2. 效果

ArkUI eTS PA计算十二生肖[Service Ability]-鸿蒙开发者社区
ArkUI eTS PA计算十二生肖[Service Ability]-鸿蒙开发者社区

3. 讲解

  1. 首先创建Service Ability,如下图:
    ArkUI eTS PA计算十二生肖[Service Ability]-鸿蒙开发者社区
    ArkUI eTS PA计算十二生肖[Service Ability]-鸿蒙开发者社区

  2. 创建好Service Ability后,会自动在config.json生成以下配置:
    ArkUI eTS PA计算十二生肖[Service Ability]-鸿蒙开发者社区

  3. 下面开始来讲解Service Ability如何写并计算出生肖,如果之前没有JS 调用Java Ability经验的,可以先看一下官方文档CallAbility调用基本计算服务示例 这个实例有详细讲解,我也是参考些文档.

  4. FA在请求PA服务时会调用Ability.connectAbility连接PA,连接成功后,需要在onConnect返回一个remote对象,供FA向PA发送消息

@Override
protected IRemoteObject onConnect(Intent intent) {
   super.onConnect(intent);
   return remote.asObject();
}
  1. Remote对象里面请求方法自己实现,自定义MyRemote类
class MyRemote extends RemoteObject implements IRemoteBroker {
        private static final int SUCCESS = 0;
        private static final int ERROR = 1;
        private static final int PLUS = 1001;

        /**
         * 构造方法
         */
        public MyRemote() {
            super("MyService_MyRemote");
        }

        @Override
        public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) throws RemoteException {
            // code是eTS传参messageCode
            switch (code) {
                case PLUS: {
                    // 读取参数数据
                    String dataStr = data.readString();
                    HiLog.info(LABEL_LOG, "xx" + dataStr);
                    Map<String, Object> param = new HashMap<>();
                    int year = -1;
                    try {
                        // 把读取到字符串参数转为Map对象
                        param = ZSONObject.stringToClass(dataStr, Map.class);
                        // 从对象中获取参数年份
                        year = Integer.parseInt( String.valueOf(param.get("year")));
                        HiLog.info(LABEL_LOG, "xx获取到年份是: " + year);
                    }catch (RuntimeException e) {
                        HiLog.error(LABEL_LOG, "convert failed.");
                    }
                    // Java计算十二生肖
                    String born = getBornFromJava(year);

                    // 返回结果当前仅支持String,对于复杂结构可以序列化为ZSON字符串上报
                    Map<String, Object> result = new HashMap<>();
                    result.put("code", SUCCESS);
                    result.put("abilityResult", born);
                    reply.writeString(ZSONObject.toZSONString(result));

                    break;
                }
                default: {
                    Map<String, Object> result = new HashMap<>();
                    result.put("code", ERROR);
                    result.put("abilityError", "服务器繁忙, 请稍后再试!!!");
                    reply.writeString(ZSONObject.toZSONString(result));
                    return false;
                }
            }

            return true;
        }

        @Override
        public IRemoteObject asObject() {
            return this;
        }
    }
  1. 根据年份计算生肖方法
private String[] zodiac = {"猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊"};

    /**
     * Java计算十二生肖
     * @param year
     * @return
     */
    private String getBornFromJava(int year) {
        if (year == -1) { return "不是有效年份"; }
        int idx = year % 12;
        return zodiac[idx];
    }

到此Java代码就讲解完了,下来看看eTS如何调用刚才创建的Service Ability。

  1. 前端调用Service Ability,修改一下之前getBorn函数就可以
// 计算生肖
    getBorn() {
        // eTS端计算十二生肖
//        let idx = this.year%12
//        this.born = this.zodiac[idx]

        let that = this;
        // 调用PA返回十二生肖
        FeatureAbility.callAbility({
            bundleName: "com.demo",
            abilityName: "com.demo.ZodiacServiceAbility",
            // abilityType: 0-Ability; 1-Internal Ability
            abilityType: 0,
            messageCode: 1001,
            data: {year: this.year},
            // syncOption(Optional, default sync): 0-Sync; 1-Async
            syncOption: 0
        }).then((data) => {
            console.info("xx返回结果是: " + data);
            let jsonObj = JSON.parse(data);
            if(jsonObj.code === 0) {
                that.born = jsonObj.abilityResult;
            }else{
                AlertDialog.show({
                    message: jsonObj.abilityError
                })
            }
        })
    }

4. 总结

计算生肖由Service Ability负责,eTS只负责UI,这样把业务逻辑抽出来了,比如Java UI也实现这个计算生肖功能,就可以调用Service Ability的计算生肖方法,从而把计算生肖方法共用出来,如果把计算生肖逻辑放到云函数上,那样H5, 小程序等其它都可以调用。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-7-7 18:50:05修改
6
收藏 2
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

赞!又学到了一招

2
回复
2022-7-8 10:18:31
回复
    相关推荐