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

在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
拉起一个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): 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
启动新的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页面的方式的不同)