記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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章