• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用router事件跳转到指定UIAbility
2
3
4在卡片中使用**postCardAction**接口的router能力,能够快速拉起卡片提供方应用的指定UIAbility,因此UIAbility较多的应用往往会通过卡片提供不同的跳转按钮,实现一键直达的效果。例如相机卡片,卡片上提供拍照、录像等按钮,点击不同按钮将拉起相机应用的不同UIAbility,从而提高用户的体验。
5![WidgerCameraCard](figures/WidgerCameraCard.png)
6
7
8通常使用按钮控件来实现页面拉起,示例代码如下:
9
10
11- 在卡片页面中布局两个按钮,点击其中一个按钮时调用postCardAction向指定UIAbility发送router事件,并在事件内定义需要传递的内容。
12
13  ```ts
14  @Entry
15  @Component
16  struct WidgetCard {
17    build() {
18      Column() {
19        Button('功能A')
20          .margin('20%')
21          .onClick(() => {
22            console.info('Jump to EntryAbility funA');
23            postCardAction(this, {
24              'action': 'router',
25              'abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility
26              'params': {
27                'targetPage': 'funA' // 在EntryAbility中处理这个信息
28              }
29            });
30          })
31
32        Button('功能B')
33          .margin('20%')
34          .onClick(() => {
35            console.info('Jump to EntryAbility funB');
36            postCardAction(this, {
37              'action': 'router',
38              'abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility
39              'params': {
40                'targetPage': 'funB' // 在EntryAbility中处理这个信息
41              }
42            });
43          })
44      }
45      .width('100%')
46      .height('100%')
47    }
48  }
49  ```
50
51- 在UIAbility中接收router事件并获取参数,根据传递的message不同,选择拉起不同的页面。
52
53  ```ts
54  import UIAbility from '@ohos.app.ability.UIAbility';
55  import window from '@ohos.window';
56
57  let selectPage = "";
58  let currentWindowStage = null;
59
60  export default class CameraAbility extends UIAbility {
61    // 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调
62    onCreate(want, launchParam) {
63      // 获取router事件中传递的targetPage参数
64      console.info("onCreate want:" + JSON.stringify(want));
65      if (want.parameters.params !== undefined) {
66        let params = JSON.parse(want.parameters.params);
67        console.info("onCreate router targetPage:" + params.targetPage);
68        selectPage = params.targetPage;
69      }
70    }
71    // 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调
72    onNewWant(want, launchParam) {
73      console.info("onNewWant want:" + JSON.stringify(want));
74      if (want.parameters.params !== undefined) {
75        let params = JSON.parse(want.parameters.params);
76        console.info("onNewWant router targetPage:" + params.targetPage);
77        selectPage = params.targetPage;
78      }
79      if (currentWindowStage != null) {
80        this.onWindowStageCreate(currentWindowStage);
81      }
82    }
83
84    onWindowStageCreate(windowStage: window.WindowStage) {
85      let targetPage;
86      // 根据传递的targetPage不同,选择拉起不同的页面
87      switch (selectPage) {
88        case 'funA':
89          targetPage = 'pages/FunA';
90          break;
91        case 'funB':
92          targetPage = 'pages/FunB';
93          break;
94        default:
95          targetPage = 'pages/Index';
96      }
97      if (currentWindowStage === null) {
98        currentWindowStage = windowStage;
99      }
100      windowStage.loadContent(targetPage, (err, data) => {
101        if (err && err.code) {
102          console.info('Failed to load the content. Cause: %{public}s', JSON.stringify(err));
103          return;
104        }
105      });
106    }
107  };
108  ```
109