记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<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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容