在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);
}
}