【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”

%E5%87%86%E5%A4%87%E9%98%B6%E6%AE%B5.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%')
  }
}

效果如圖所示

cke_31499.png

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"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:background_element="#ed6262"
    ohos:orientation="vertical">

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

</DirectionalLayout>

效果如下

cke_50680.png

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"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

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

</DirectionalLayout>

效果圖如下

cke_80063.png

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

ets全部代碼如下

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

運行效果如下

%E8%BF%90%E8%A1%8C%E6%95%88%E6%9E%9C.gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章