0
点赞
收藏
分享

微信扫一扫

ArkUI eTS PA计算十二生肖[Service Ability]

@toc

1. 前言

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

2. 效果

3. 讲解

  1. 首先创建Service Ability,如下图:
    image.png
    image.png

  2. 创建好Service Ability后,会自动在config.json生成以下配置:
    image.png

  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();
    }
  5. 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;
        }
    }
  6. 根据年份计算生肖方法

    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。

  7. 前端调用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, 小程序等其它都可以调用。

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com/#bkwz

举报

相关推荐

0 条评论