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