今天學習一下怎麼實作啟動一個Ability文檔講解,主要分為“參考資料”“api講解”,“運作效果”三個部分講解,
1.參考資料
參考資料啟動一個Ability
2.Api講解
startAbility
參數
參數名 | 類型 | 必填 | 說明 |
parameter | StartAbilityParameter | 是 | 啟動參數。 |
傳回值
類型 | 說明 |
Promise | Promise形式傳回啟動結果。錯誤碼參考 StartAbilityCode |
示例
var str = {
"want": {
"deviceId": "",
"bundleName": "",
"abilityName": "",
"uri": "",
"type": "image/*",
"options": {},
"action": "",
"parameters": {},
"entities": [
"entity.com.example.mytest.ENTITIES"
]
},
"abilityStartSetting": {}
};
featureAbility.startAbility(str)
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
}).catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})
featureAbility.startAbilityForResult
startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback): void
以異步方法啟動Ability并在結束的時候傳回執行結果,使用callback形式傳回結果。
參數:
參數名 | 類型 | 必填 | 說明 |
parameter | StartAbilityParameter | 是 | 啟動參數。 |
callback | AsyncCallback | 是 | callback形式傳回結果 |
示例
var str = {
"want": {
"deviceId": "",
"bundleName": "",
"abilityName": "",
"uri": "",
"type": "",
"action": "",
"parameters": {},
"entities": [
"entity.com.example.mytest.ENTITIES"
]
},
"abilityStartSetting": {}
};
featureAbility.startAbilityForResult(str, (error, data) => {
if (error) {
console.error('Operation failed. Cause: ' + error);
return;
}
console.info('Operation succeeded: ' + data);
});
補充說明
StartAbilityParameter
啟動Ability所需參數。
名稱 | 參數類型 | 可讀 | 可寫 | 說明 |
want | Want | 是 | 是 | 啟動Ability的want資訊。 |
abilityStartSetting | {[key: string]: any} | 是 | 是 | 表示能力的特殊屬性,當開發者啟動能力時,該屬性可以作為調用中的輸入參數傳遞。 |
taskSyncAnimationOptions | TaskSyncAnimationOptions | 是 | 是 | 啟動Ability時需要進行動畫控制的特殊屬性,當開發者希望控制啟動Ability的動畫時,請傳入該參數,需要權限ohos.permission.CONTROL_TASK_SYNC_ANIMATOR。 |
Want
啟動資訊。
名稱 | 參數類型 | 可讀 | 可寫 | 說明 |
deviceId | string | 是 | 是 | 表示運作指定Ability的裝置ID。 |
bundleName | string | 是 | 是 | 表示包描述。如果在Want中同時指定了BundleName和AbilityName,則Want可以直接比對到指定的Ability。 |
abilityName | string | 是 | 是 | 表示待啟動的Ability名稱。如果在Want中同時指定了BundleName和AbilityName,則Want可以直接比對到指定的Ability。 |
uri | string | 是 | 是 | 表示Uri描述。如果在Want中指定了Uri,則Want将比對指定的Uri資訊,包括scheme, schemeSpecificPart, authority和path資訊。 |
type | string | 是 | 是 | 表示MIME type類型描述,比如:“text/plain” 、 "image/*"等。 |
action | string | 是 | 是 | 表示action選項描述。具體參考:Action使用時通過wantConstant.Action擷取,示例:wantConstant.Action.ACTION_HOME。 |
entities | Array | 是 | 是 | 表示entities相關描述。具體參考:Entity使用時通過wantConstant.Entity擷取,示例:wantConstant.Entity.ENTITY_DEFAULT。 |
flags | number | 是 | 是 | 表示處理Want的方式。預設傳數字,具體參考:Flags使用時通過wantConstant.Flags擷取,示例:wantConstant.Flags.FLAG_INSTALL_ON_DEMAND。 |
parameters | {[key: string]: any} | 是 | 是 | 表示WantParams描述。 |
3.運作效果
3.1準備階段
在建立OnceAbility和TwoAbility兩個Ability界面,如下圖示所示,包名為“com.harmony.alliance.myapplication”
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SOwUDO0cTZlF2NkVWM3ATOyYzX3MDOzQTM3IzLcVDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.gif)
config.json檔案
2.在Index.ets寫兩個按鈕“startAbility啟動OnceAbility并傳參”和“startAbilityForResult跳轉TwoAbility”,代碼如下
import featureAbility from '@ohos.ability.featureAbility';
@Entry
@Component
struct Index {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text('startAbility啟動OnceAbility并傳參')
.fontSize(50)
.fontWeight(FontWeight.Bold)
Text('startAbilityForResult跳轉TwoAbility')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.backgroundColor(Color.Red)
}
.width('100%')
.height('100%')
}
}複制
效果如圖所示
3.2實作“startAbility啟動OnceAbility并傳參”
ets 實作點選按鈕功能,代碼如下
bundleName:就是config.json的bundleName,
abilityName就是ability的名稱,
parameters:作為傳遞的參數
在OnceAbilitySlice使用如下代碼進行接收
Intent intent1= getAbility().getIntent();
IntentParams myIntentParams= intent1.getParams();
myIntentParams.getParam("key1")複制
public startOnceAbility(){
var str = {
"want": {
"deviceId": "",
"bundleName": "com.harmony.alliance.myapplication",
"abilityName": "OnceAbility",
"uri": "",
"action": "",
"parameters":{key1:"value1",key2:"value2"}
},
};
featureAbility.startAbility(str)
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
}).catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})
}複制
OnceAbilitySlice的xml檔案
<?xml version="1.0" encoding="utf-8"?>
< xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:background_element="#ed6262"
ohos:orientation="vertical">
< ohos:top_margin="20vp"
ohos:id="$+id:text_helloworld"
ohos:height="200vp"
ohos:width="match_content"
ohos:layout_alignment="horizontal_center"
ohos:text="這是OnceAbility"
ohos:text_size="40vp"
/>
< ohos:id="$+id:mTvResult"
ohos:height="200vp"
ohos:width="match_parent"
ohos:text="參數:"
ohos:multiple_lines="true"
ohos:text_size="40vp"
ohos:padding="10fp"
ohos:background_element="#ffffff"/>
</>複制
效果如下
onceAbilitySlice代碼如下
package com.harmony.alliance.myapplication.slice;
import com.harmony.alliance.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.IntentParams;
import ohos.agp.components.Text;
public class OnceAbilitySlice extends AbilitySlice {
Text mTvResult;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_once);
Intent intent1= getAbility().getIntent();
IntentParams myIntentParams= intent1.getParams();
mTvResult=findComponentById(ResourceTable.Id_mTvResult);
mTvResult.setText("參數:"+"key1"+"===>"+myIntentParams.getParam("key1")+
"\n key2:"+"===>"+myIntentParams.getParam("key2"));
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}複制
3.3實作“startAbility啟動OnceAbility并傳參”
ets實作“startAbilityForResult跳轉TwoAbility”ets代碼如下
public startTwoAbility(){
var str = {
"want": {
"deviceId": "",
"bundleName": "com.harmony.alliance.myapplication",
"abilityName": "TwoAbility",
"uri": "",
"type": "",
"action": "",
},
"abilityStartSetting": {}
};
featureAbility.startAbilityForResult(str, (error, data) => {
if (error) {
console.error('Operation failed. Cause: ' + error);
return;
}
console.info('Operation succeeded: ' + JSON.stringify(data));
});
}
twoAbilitySlice的xml代碼如下
<?xml version="1.0" encoding="utf-8"?>
< xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:alignment="center"
ohos:orientation="vertical">
< ohos:id="$+id:text_helloworld"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_two"
ohos:layout_alignment="horizontal_center"
ohos:text="關閉并回傳資料"
ohos:text_size="40vp"
/>
</>
效果圖如下
TwoabilitySlice的代碼如下
package com.harmony.alliance.myapplication.slice;
import com.harmony.alliance.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
public class TwoAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_two);
findComponentById(ResourceTable.Id_text_helloworld).setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
Intent intent1 = new Intent();
intent1.setParam("key", "value");
getAbility().setResult(1001, intent1);
terminateAbility();
}
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
import featureAbility from '@ohos.ability.featureAbility';
@Entry
@Component
struct Index {
public startOnceAbility(){
var str = {
"want": {
"deviceId": "",
"bundleName": "com.harmony.alliance.myapplication",
"abilityName": "OnceAbility",
"uri": "",
"action": "",
"parameters":{key1:"value1",key2:"value2"}
},
};
featureAbility.startAbility(str)
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
}).catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})
}
public startTwoAbility(){
var str = {
"want": {
"deviceId": "",
"bundleName": "com.harmony.alliance.myapplication",
"abilityName": "TwoAbility",
"uri": "",
"type": "",
"action": "",
},
"abilityStartSetting": {}
};
featureAbility.startAbilityForResult(str, (error, data) => {
if (error) {
console.error('Operation failed. Cause: ' + error);
return;
}
console.info('Operation succeeded: ' + JSON.stringify(data));
});
}
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text('startAbility啟動OnceAbility并傳參')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(this.startOnceAbility.bind(this))
Text('startAbilityForResult跳轉TwoAbility')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(this.startTwoAbility.bind(this))
.backgroundColor(Color.Red)
}
.width('100%')
.height('100%')
}
}