美文网首页
记HarmonyOS FA中两种拉起Ability页面的方式的不

记HarmonyOS FA中两种拉起Ability页面的方式的不

作者: 蜗牛学开车 | 来源:发表于2022-11-24 11:37 被阅读0次

    在HarmonyOS中拉起FA页面有两种方式:

    一、 分布式拉起

    文档地址

    说明:

    • 从API Version 7 开始,该接口不再维护,推荐使用新接口'@ohos.ability.featureAbility'
    • 本模块首批接口从API version 4开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
    • 本模块接口仅支持在基于JS扩展的类Web开发范式下使用。
      分布式拉起允许拉起一个本地或远程的FA,拉起时可以传递参数。如果使用startAbilityForResult还可以获得FA的运行结果。

    注意:如果设备上已经运行该FA,且launchType为singleton,则生命周期onNewRequest()将被回调。

    支持设备

    API 手机 平板 智慧屏 智能穿戴
    FeatureAbility.startAbility 支持 支持 支持 支持
    FeatureAbility. startAbilityForResult 支持 支持 支持 支持
    FeatureAbility. finishWithResult 支持 支持 支持 支持
    onNewRequest 支持 支持 支持 支持
    FeatureAbility.getDeviceList 6+ 支持 支持 支持 支持

    模块导入
    无需导入

    权限列表
    ohos.permission.DISTRIBUTED_DATASYNC
    ohos.permission.GET_DISTRIBUTED_DEVICE_INFO
    此外,还需要在FA的onStart()中,调用requestPermissionsFromUser()方法向用户申请权限,代码示例如下:

    public class MainAbility extends Ability implements IAbilityContinuation {
        @Override
        public void onStart(Intent intent) {
            super.onStart(intent); 
            // 开发者显示声明需要使用的权限
            requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
        }
    }
    

    FeatureAbility.startAbility

    startAbility(request: RequestParams): Promise<Result>
    拉起一个FA,无回调结果。允许以显式的方式,拉起远程或本地的FA。

    说明:FeatureAbility.startAbilityForResult()需要与FeatureAbility.finishWithResult()关联使用。
    示例:
    下面的示例展示了一个ability如何拉起另一个ability,并在另一个ability退出时拿到其中的数据。

    // caller
    export default {
        data: {
            startAbilityForResultExplicitResult: 'NA'
        },
        startAbilityForResultExplicit: async function() {
            var result = await FeatureAbility.startAbilityForResult({
              bundleName: "com.example.harmonydevsample",
              abilityName: "com.example.harmonydevsample.EntryJSApiAbility"
            });
            this.startAbilityForResultExplicitResult = JSON.stringify(result);
        }
    }
    
    // callee
    export default {
        onShow() {
            let request = {};
            request.result = {
              contact: "contact information",
              location: "location information"
            };
            FeatureAbility.finishWithResult(100, request);
        }
    }
    

    二、FeatureAbility模块

    文档地址

    FeatureAbility模块提供带有UI设计与用户交互的能力,包括启动新的ability、获取dataAbilityHelper、设置此Page Ability、获取当前Ability对应的窗口,连接服务等。
    说明

    • 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
    • 本模块接口仅可在FA模型下使用。
    • FeatureAbility模块的接口只能在Page类型的Ability调用

    导入模块

    import featureAbility from '@ohos.ability.featureAbility'
    

    featureAbility.startAbility

    startAbility(parameter: StartAbilityParameter, callback: AsyncCallback<number>): void

    示例:

    import featureAbility from '@ohos.ability.featureAbility'
    import wantConstant from '@ohos.ability.wantConstant'
    featureAbility.startAbility(
        {
            want:
            {
                action: "",
                entities: [""],
                type: "",
                flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
                deviceId: "",
                bundleName: "com.example.myapplication",
                /* FA模型中abilityName由package + Ability name组成 */
                abilityName: "com.example.entry.secondAbility",
                uri: ""
            },
        },
        (err, data) => {
            console.info("err: " + JSON.stringify(err) + "data: " + JSON.stringify(data))
        }
    );
    

    featureAbility.startAbility

    startAbility(parameter: StartAbilityParameter): Promise<number>
    启动新的ability(Promise形式)。
    系统能力:SystemCapability.Ability.AbilityRuntime.FAModel

    示例:*

    import featureAbility from '@ohos.ability.featureAbility'
    import wantConstant from '@ohos.ability.wantConstant'
    featureAbility.startAbility(
        {
            want:
            {
                action: "action.system.home",
                entities: ["entity.system.home"],
                type: "MIMETYPE",
                flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
                deviceId: "",
                bundleName: "com.example.myapplication",
                /* FA模型中abilityName由package + Ability name组成 */
                abilityName: "com.example.entry.secondAbility",
                uri: ""
            },
        }
    ).then((data) => {
        console.info("==========================>startAbility=======================>");
    });
    

    补充

    通过FeatureAbility.startAbility启动Ability有以下两点需要注意:

    1. 启动后再某些情况下当前Ability会被销毁。目前已知的是拉起同一Hap包内的Ability会销毁当前Ability,而拉起不同Hap包下的Ability不会销毁当前Ability。
    2. 如需要对jsFA的传值进行整理则需要在java层通过intent.getStringParam("__startParams")获取到值并进行处理,然后通过setPageParams("pages/index/index", intent.getParams());为目标页js FA面传值。

    示例:
    js FA拉起Java Ability

    startFullAbility(){
        var action = {};
        action.bundleName = 'com.baidu.testapp';
        action.flag = 286435456;
        action.abilityName = 'com.baidu.testapp.DeviceFullAbility'
        action.data = {
        deviceInfo: getApp(this).Device
        };
        //@ts-ignore
        FeatureAbility.startAbility(action);
    }
    

    Java Ability处理 js FA传来的数据

    public class DeviceFullAbility extends AceAbility {
        @Override
        public void onStart(Intent intent) {
            setInstanceName("devicefull");
            String startParams = intent.getStringParam("__startParams");
            if (startParams != null && !startParams.isEmpty()) {
                ZSONObject zsonObj = ZSONObject.stringToZSON(startParams);
                IntentParams deviceInfo = new IntentParams();
                zsonObj.getZSONObject("deviceInfo").entrySet().forEach(entry -> {
                    deviceInfo.setParam(entry.getKey(), entry.getValue());
                });
                intent.setParam("deviceInfo", deviceInfo);
                setPageParams("pages/index/index", intent.getParams());
            }
            super.onStart(intent);
        }
    }
    

    相关文章

      网友评论

          本文标题:记HarmonyOS FA中两种拉起Ability页面的方式的不

          本文链接:https://www.haomeiwen.com/subject/raatfdtx.html