arkts-ui-widget-event-router.md 4.3 KB
Newer Older
W
wangkailong 已提交
1
# 使用router事件跳转到指定UIAbility
Z
zhongjianfei 已提交
2

W
wangkailong 已提交
3
在卡片中使用**postCardAction**接口的router能力,能够快速拉起卡片提供方应用的指定UIAbility,因此UIAbility较多的应用往往会通过卡片提供不同的跳转按钮,实现一键直达的效果。例如相机卡片,卡片上提供拍照、录像等按钮,点击不同按钮将拉起相机应用的不同UIAbility,从而提高用户的体验。
Z
zhongjianfei 已提交
4

Z
zhongjianfei 已提交
5 6 7
![WidgerCameraCard](figures/WidgerCameraCard.png)


D
dujingcheng 已提交
8 9
说明:<br/>  本文主要介绍动态卡片的事件开发。对于静态卡片,请参见[FormLink](../../application-dev/reference/arkui-ts/ts-container-formlink.md)<br/>
通常使用按钮控件来实现页面拉起,示例代码如下:
Z
zhongjianfei 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56


- 在卡片页面中布局两个按钮,点击其中一个按钮时调用postCardAction向指定UIAbility发送router事件,并在事件内定义需要传递的内容。
  
  ```ts
  @Entry
  @Component
  struct WidgetCard {
    build() {
      Column() {
        Button('功能A')
          .margin('20%')
          .onClick(() => {
            console.info('Jump to EntryAbility funA');
            postCardAction(this, {
              'action': 'router',
              'abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility
              'params': {
                'targetPage': 'funA' // 在EntryAbility中处理这个信息
              }
            });
          })
  
        Button('功能B')
          .margin('20%')
          .onClick(() => {
            console.info('Jump to EntryAbility funB');
            postCardAction(this, {
              'action': 'router',
              'abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility
              'params': {
                'targetPage': 'funB' // 在EntryAbility中处理这个信息
              }
            });
          })
      }
      .width('100%')
      .height('100%')
    }
  }
  ```

- 在UIAbility中接收router事件并获取参数,根据传递的message不同,选择拉起不同的页面。
  
  ```ts
  import UIAbility from '@ohos.app.ability.UIAbility';
  import window from '@ohos.window';
X
xuzhihao 已提交
57 58 59
  import Want from '@ohos.app.ability.Want';
  import Base from '@ohos.base';
  import AbilityConstant from '@ohos.app.ability.AbilityConstant';
Z
zhongjianfei 已提交
60
  
X
xuzhihao 已提交
61 62 63
  let selectPage: string = "";
  let currentWindowStage: window.WindowStage | null = null;

W
form  
wangkailong 已提交
64
  export default class EntryAbility extends UIAbility {
Z
zhongjianfei 已提交
65
    // 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调
X
xuzhihao 已提交
66
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
Z
zhongjianfei 已提交
67 68
      // 获取router事件中传递的targetPage参数
      console.info("onCreate want:" + JSON.stringify(want));
X
xuzhihao 已提交
69 70
      if (want.parameters?.params !== undefined) {
        let params: Record<string, string> = JSON.parse(JSON.stringify(want.parameters?.params));
Z
zhongjianfei 已提交
71 72 73 74 75
        console.info("onCreate router targetPage:" + params.targetPage);
        selectPage = params.targetPage;
      }
    }
    // 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调
X
xuzhihao 已提交
76
    onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
Z
zhongjianfei 已提交
77
      console.info("onNewWant want:" + JSON.stringify(want));
X
xuzhihao 已提交
78 79
      if (want.parameters?.params !== undefined) {
        let params: Record<string, string> = JSON.parse(JSON.stringify(want.parameters?.params));
Z
zhongjianfei 已提交
80 81 82 83 84 85 86
        console.info("onNewWant router targetPage:" + params.targetPage);
        selectPage = params.targetPage;
      }
      if (currentWindowStage != null) {
        this.onWindowStageCreate(currentWindowStage);
      }
    }
X
xuzhihao 已提交
87

Z
zhongjianfei 已提交
88
    onWindowStageCreate(windowStage: window.WindowStage) {
X
xuzhihao 已提交
89
      let targetPage: string;
Z
zhongjianfei 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103
      // 根据传递的targetPage不同,选择拉起不同的页面
      switch (selectPage) {
        case 'funA':
          targetPage = 'pages/FunA';
          break;
        case 'funB':
          targetPage = 'pages/FunB';
          break;
        default:
          targetPage = 'pages/Index';
      }
      if (currentWindowStage === null) {
        currentWindowStage = windowStage;
      }
X
xuzhihao 已提交
104
      windowStage.loadContent(targetPage, (err: Base.BusinessError) => {
Z
zhongjianfei 已提交
105 106 107 108 109 110 111 112
        if (err && err.code) {
          console.info('Failed to load the content. Cause: %{public}s', JSON.stringify(err));
          return;
        }
      });
    }
  };
  ```