在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有以下两点需要注意:
- 启动后再某些情况下当前Ability会被销毁。目前已知的是拉起同一Hap包内的Ability会销毁当前Ability,而拉起不同Hap包下的Ability不会销毁当前Ability。
- 如需要对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);
}
}