天天看點

【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式調起Ability

今天學習一下怎麼實作啟動一個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”

【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式調起Ability

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%')
  }
}複制      

效果如圖所示

【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式調起Ability

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"/>

</>複制      

效果如下

【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式調起Ability

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"
        />

</>      

效果圖如下

【Harmony OS】【ARK UI】ets使用startAbility或startAbilityForResult方式調起Ability

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%')
  }
}