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


     今天学习一下怎么实现启动一个Ability文档讲解,主要分为“参考资料”“api讲解”,“运行效果”三个部分讲解,

    1.参考资料


    参考资料启动一个Ability

    2.Api讲解


    startAbility

    参数

    参数名类型必填说明
    parameterStartAbilityParameter启动参数。

    返回值

    类型说明
    PromisePromise形式返回启动结果。错误码参考 StartAbilityCode

    示例

    1. var str = {
    2. "want": {
    3. "deviceId": "",
    4. "bundleName": "",
    5. "abilityName": "",
    6. "uri": "",
    7. "type": "image/*",
    8. "options": {},
    9. "action": "",
    10. "parameters": {},
    11. "entities": [
    12. "entity.com.example.mytest.ENTITIES"
    13. ]
    14. },
    15. "abilityStartSetting": {}
    16. };
    17. featureAbility.startAbility(str)
    18. .then((data) => {
    19. console.info('Operation successful. Data: ' + JSON.stringify(data))
    20. }).catch((error) => {
    21. console.error('Operation failed. Cause: ' + JSON.stringify(error));
    22. })

    featureAbility.startAbilityForResult

    startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback): void

    以异步方法启动Ability并在结束的时候返回执行结果,使用callback形式返回结果。

    参数:

    参数名类型必填说明
    parameterStartAbilityParameter启动参数。
    callbackAsyncCallbackcallback形式返回结果

    示例

    1. var str = {
    2. "want": {
    3. "deviceId": "",
    4. "bundleName": "",
    5. "abilityName": "",
    6. "uri": "",
    7. "type": "",
    8. "action": "",
    9. "parameters": {},
    10. "entities": [
    11. "entity.com.example.mytest.ENTITIES"
    12. ]
    13. },
    14. "abilityStartSetting": {}
    15. };
    16. featureAbility.startAbilityForResult(str, (error, data) => {
    17. if (error) {
    18. console.error('Operation failed. Cause: ' + error);
    19. return;
    20. }
    21. console.info('Operation succeeded: ' + data);
    22. });

    补充说明

    StartAbilityParameter

    启动Ability所需参数。

    名称参数类型可读可写说明
    wantWant启动Ability的want信息。
    abilityStartSetting{[key: string]: any}表示能力的特殊属性,当开发者启动能力时,该属性可以作为调用中的输入参数传递。
    taskSyncAnimationOptionsTaskSyncAnimationOptions启动Ability时需要进行动画控制的特殊属性,当开发者希望控制启动Ability的动画时,请传入该参数,需要权限ohos.permission.CONTROL_TASK_SYNC_ANIMATOR。

    Want

    启动信息。

    名称参数类型可读可写说明
    deviceIdstring表示运行指定Ability的设备ID。
    bundleNamestring表示包描述。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
    abilityNamestring表示待启动的Ability名称。如果在Want中同时指定了BundleName和AbilityName,则Want可以直接匹配到指定的Ability。
    uristring表示Uri描述。如果在Want中指定了Uri,则Want将匹配指定的Uri信息,包括scheme, schemeSpecificPart, authority和path信息。
    typestring表示MIME type类型描述,比如:“text/plain” 、 "image/*"等。
    actionstring表示action选项描述。具体参考:Action使用时通过wantConstant.Action获取,示例:wantConstant.Action.ACTION_HOME。
    entitiesArray表示entities相关描述。具体参考:Entity使用时通过wantConstant.Entity获取,示例:wantConstant.Entity.ENTITY_DEFAULT。
    flagsnumber表示处理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”,代码如下

    1. import featureAbility from '@ohos.ability.featureAbility';
    2. @Entry
    3. @Component
    4. struct Index {
    5. build() {
    6. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
    7. Text('startAbility启动OnceAbility并传参')
    8. .fontSize(50)
    9. .fontWeight(FontWeight.Bold)
    10. Text('startAbilityForResult跳转TwoAbility')
    11. .fontSize(50)
    12. .fontWeight(FontWeight.Bold)
    13. .backgroundColor(Color.Red)
    14. }
    15. .width('100%')
    16. .height('100%')
    17. }
    18. }

    效果如图所示

    cke_31499.png

    3.2实现“startAbility启动OnceAbility并传参”

    ets 实现点击按钮功能,代码如下

    bundleName:就是config.json的bundleName,

    abilityName就是ability的名称

    parameters:作为传递的参数

    在OnceAbilitySlice使用如下代码进行接收

    1. Intent intent1= getAbility().getIntent();
    2. IntentParams myIntentParams= intent1.getParams();
    3. myIntentParams.getParam("key1")
    1. public startOnceAbility(){
    2. var str = {
    3. "want": {
    4. "deviceId": "",
    5. "bundleName": "com.harmony.alliance.myapplication",
    6. "abilityName": "OnceAbility",
    7. "uri": "",
    8. "action": "",
    9. "parameters":{key1:"value1",key2:"value2"}
    10. },
    11. };
    12. featureAbility.startAbility(str)
    13. .then((data) => {
    14. console.info('Operation successful. Data: ' + JSON.stringify(data))
    15. }).catch((error) => {
    16. console.error('Operation failed. Cause: ' + JSON.stringify(error));
    17. })
    18. }

    OnceAbilitySlice的xml文件

    1. "1.0" encoding="utf-8"?>
    2. <DirectionalLayout
    3. xmlns:ohos="http://schemas.huawei.com/res/ohos"
    4. ohos:height="match_parent"
    5. ohos:width="match_parent"
    6. ohos:background_element="#ed6262"
    7. ohos:orientation="vertical">
    8. <Text
    9. ohos:top_margin="20vp"
    10. ohos:id="$+id:text_helloworld"
    11. ohos:height="200vp"
    12. ohos:width="match_content"
    13. ohos:layout_alignment="horizontal_center"
    14. ohos:text="这是OnceAbility"
    15. ohos:text_size="40vp"
    16. />
    17. <Text
    18. ohos:id="$+id:mTvResult"
    19. ohos:height="200vp"
    20. ohos:width="match_parent"
    21. ohos:text="参数:"
    22. ohos:multiple_lines="true"
    23. ohos:text_size="40vp"
    24. ohos:padding="10fp"
    25. ohos:background_element="#ffffff"/>
    26. DirectionalLayout>

    效果如下

    cke_50680.png

    onceAbilitySlice代码如下

    1. package com.harmony.alliance.myapplication.slice;
    2. import com.harmony.alliance.myapplication.ResourceTable;
    3. import ohos.aafwk.ability.AbilitySlice;
    4. import ohos.aafwk.content.Intent;
    5. import ohos.aafwk.content.IntentParams;
    6. import ohos.agp.components.Text;
    7. public class OnceAbilitySlice extends AbilitySlice {
    8. Text mTvResult;
    9. @Override
    10. public void onStart(Intent intent) {
    11. super.onStart(intent);
    12. super.setUIContent(ResourceTable.Layout_ability_once);
    13. Intent intent1= getAbility().getIntent();
    14. IntentParams myIntentParams= intent1.getParams();
    15. mTvResult=findComponentById(ResourceTable.Id_mTvResult);
    16. mTvResult.setText("参数:"+"key1"+"===>"+myIntentParams.getParam("key1")+
    17. "\n key2:"+"===>"+myIntentParams.getParam("key2"));
    18. }
    19. @Override
    20. public void onActive() {
    21. super.onActive();
    22. }
    23. @Override
    24. public void onForeground(Intent intent) {
    25. super.onForeground(intent);
    26. }

    3.3实现“startAbility启动OnceAbility并传参”

    ets实现“startAbilityForResult跳转TwoAbility”ets代码如下

    1. public startTwoAbility(){
    2. var str = {
    3. "want": {
    4. "deviceId": "",
    5. "bundleName": "com.harmony.alliance.myapplication",
    6. "abilityName": "TwoAbility",
    7. "uri": "",
    8. "type": "",
    9. "action": "",
    10. },
    11. "abilityStartSetting": {}
    12. };
    13. featureAbility.startAbilityForResult(str, (error, data) => {
    14. if (error) {
    15. console.error('Operation failed. Cause: ' + error);
    16. return;
    17. }
    18. console.info('Operation succeeded: ' + JSON.stringify(data));
    19. });
    20. }

    twoAbilitySlice的xml代码如下

    1. "1.0" encoding="utf-8"?>
    2. <DirectionalLayout
    3. xmlns:ohos="http://schemas.huawei.com/res/ohos"
    4. ohos:height="match_parent"
    5. ohos:width="match_parent"
    6. ohos:alignment="center"
    7. ohos:orientation="vertical">
    8. <Text
    9. ohos:id="$+id:text_helloworld"
    10. ohos:height="match_content"
    11. ohos:width="match_content"
    12. ohos:background_element="$graphic:background_ability_two"
    13. ohos:layout_alignment="horizontal_center"
    14. ohos:text="关闭并回传数据"
    15. ohos:text_size="40vp"
    16. />
    17. DirectionalLayout>

    效果图如下

    cke_80063.png

    TwoabilitySlice的代码如下

    1. package com.harmony.alliance.myapplication.slice;
    2. import com.harmony.alliance.myapplication.ResourceTable;
    3. import ohos.aafwk.ability.AbilitySlice;
    4. import ohos.aafwk.content.Intent;
    5. import ohos.agp.components.Component;
    6. public class TwoAbilitySlice extends AbilitySlice {
    7. @Override
    8. public void onStart(Intent intent) {
    9. super.onStart(intent);
    10. super.setUIContent(ResourceTable.Layout_ability_two);
    11. findComponentById(ResourceTable.Id_text_helloworld).setClickedListener(new Component.ClickedListener() {
    12. @Override
    13. public void onClick(Component component) {
    14. Intent intent1 = new Intent();
    15. intent1.setParam("key", "value");
    16. getAbility().setResult(1001, intent1);
    17. terminateAbility();
    18. }
    19. });
    20. }
    21. @Override
    22. public void onActive() {
    23. super.onActive();
    24. }
    25. @Override
    26. public void onForeground(Intent intent) {
    27. super.onForeground(intent);
    28. }
    29. }

    ets全部代码如下

    1. import featureAbility from '@ohos.ability.featureAbility';
    2. @Entry
    3. @Component
    4. struct Index {
    5. public startOnceAbility(){
    6. var str = {
    7. "want": {
    8. "deviceId": "",
    9. "bundleName": "com.harmony.alliance.myapplication",
    10. "abilityName": "OnceAbility",
    11. "uri": "",
    12. "action": "",
    13. "parameters":{key1:"value1",key2:"value2"}
    14. },
    15. };
    16. featureAbility.startAbility(str)
    17. .then((data) => {
    18. console.info('Operation successful. Data: ' + JSON.stringify(data))
    19. }).catch((error) => {
    20. console.error('Operation failed. Cause: ' + JSON.stringify(error));
    21. })
    22. }
    23. public startTwoAbility(){
    24. var str = {
    25. "want": {
    26. "deviceId": "",
    27. "bundleName": "com.harmony.alliance.myapplication",
    28. "abilityName": "TwoAbility",
    29. "uri": "",
    30. "type": "",
    31. "action": "",
    32. },
    33. "abilityStartSetting": {}
    34. };
    35. featureAbility.startAbilityForResult(str, (error, data) => {
    36. if (error) {
    37. console.error('Operation failed. Cause: ' + error);
    38. return;
    39. }
    40. console.info('Operation succeeded: ' + JSON.stringify(data));
    41. });
    42. }
    43. build() {
    44. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
    45. Text('startAbility启动OnceAbility并传参')
    46. .fontSize(50)
    47. .fontWeight(FontWeight.Bold)
    48. .onClick(this.startOnceAbility.bind(this))
    49. Text('startAbilityForResult跳转TwoAbility')
    50. .fontSize(50)
    51. .fontWeight(FontWeight.Bold)
    52. .onClick(this.startTwoAbility.bind(this))
    53. .backgroundColor(Color.Red)
    54. }
    55. .width('100%')
    56. .height('100%')
    57. }
    58. }

    运行效果如下

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

    欲了解更多更全技术文章,欢迎访问:https://developer.huawei.com/consumer/cn/forum/topic/0201822289188980017?fid=0102683795438680754?ha_source=zzh

     

  • 相关阅读:
    详解GaussDB(DWS) 资源监控
    20、wpf之MVVM命令绑定
    论语第三篇-八侑
    SpringMVC+统一表现层返回值+异常处理器
    Postman启动问题:Could not open Postman
    【校招VIP】数据库之隔离级别相关
    剑指 Offer 19. 正则表达式匹配
    醒悟的日子,我是怎么一步一步走向软件测试的道路
    使用iperf3测试远程服务器之间的带宽和延迟
    摩尔信使MThings提供丰富的组态控件
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/126125165