1# 显式Want跳转切换应用链接跳转适配指导 2 3从API 12开始,已不再推荐三方应用使用指定Ability方式(即显式Want)拉起其他应用,推荐通过指定[应用链接](app-startup-overview.md#应用链接)的方式来实现。 4 5本章节介绍如何从显式Want跳转切换到应用链接跳转。 6 7## 启动其他应用的UIAbility 8 91. 将待跳转的应用安装到设备,在其对应UIAbility的[module.json5配置文件](../quick-start/module-configuration-file.md)中配置skills标签的entities字段、actions字段和uri字段: 10 - "actions"列表中包含"ohos.want.action.viewData"。 11 - "entities"列表中包含"entity.system.browsable"。 12 - "uris"列表中包含"scheme"为"https"且"domainVerify"为true的元素。uri的匹配规则参考[uri匹配](explicit-implicit-want-mappings.md#uri匹配规则), domainVerify为true代表开启域名检查,通过applinking匹配该应用时需经过配置的域名校验后才能匹配到。applinking域名配置具体可参考AppLinking。 13 14 ```json 15 { 16 "module": { 17 // ... 18 "abilities": [ 19 { 20 // ... 21 "skills": [ 22 { 23 "entities": [ 24 "entity.system.browsable" 25 ], 26 "actions": [ 27 "ohos.want.action.viewData" 28 ], 29 "uris": [ 30 { 31 "scheme": "https", 32 "host": "www.example.com", 33 } 34 ], 35 "domainVerify": true 36 } 37 ] 38 } 39 ] 40 } 41 } 42 ``` 43 442. 调用方通过[openLink](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextopenlink12)接口执行跳转,在接口入参需要传入转换后的link和配置[options](../reference/apis-ability-kit/js-apis-app-ability-openLinkOptions.md), 不再传入bundleName、moduleName和abilityName。系统会根据传入的link匹配到符合skill配置的应用。 45 - 当options中的appLinkingOnly为true时,匹配到的应用会经过应用市场域名检查(需联网)返回域名校验检查的唯一匹配项或未匹配结果。 46 - 当options中的appLinkingOnly为false时,会优先尝试以AppLinking的方式拉起,如果没有匹配的应用则改为使用DeepLinking的方式拉起目标应用。 47 48 ```ts 49 import { common } from '@kit.AbilityKit'; 50 import OpenLinkOptions from '@ohos.app.ability.OpenLinkOptions'; 51 import { BusinessError } from '@ohos.base'; 52 import hilog from '@ohos.hilog'; 53 54 const TAG: string = '[UIAbilityComponentsOpenLink]'; 55 const DOMAIN_NUMBER: number = 0xFF00; 56 57 @Entry 58 @Component 59 struct Index { 60 build() { 61 Button('start link', { type: ButtonType.Capsule, stateEffect: true }) 62 .width('87%') 63 .height('5%') 64 .margin({ bottom: '12vp' }) 65 .onClick(() => { 66 let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 67 // 通过startAbility接口显式启动其他UIAbility,推荐使用openLink接口。 68 // let want: Want = { 69 // bundleName: "com.test.example", 70 // moduleName: "entry", 71 // abilityName: "EntryAbility" 72 // }; 73 // try { 74 // context.startAbility(want) 75 // .then(() => { 76 // hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.'); 77 // }).catch((err: BusinessError) => { 78 // hilog.error(DOMAIN_NUMBER, TAG, `startAbility failed. Code is ${err.code}, message is ${err.message}`); 79 // }) 80 // } catch (paramError) { 81 // hilog.error(DOMAIN_NUMBER, TAG, `Failed to startAbility. Code is ${paramError.code}, message is ${paramError.message}`); 82 // } 83 let link: string = "https://www.example.com"; 84 let openLinkOptions: OpenLinkOptions = { 85 // 匹配的abilities选项是否需要通过AppLinking域名校验,匹配到唯一配置过的应用ability 86 appLinkingOnly: true, 87 // 同want中的parameter,用于传递的参数 88 parameters: {demo_key: "demo_value"} 89 }; 90 91 try { 92 context.openLink(link, openLinkOptions) 93 .then(() => { 94 hilog.info(DOMAIN_NUMBER, TAG, 'open link success.'); 95 }).catch((err: BusinessError) => { 96 hilog.error(DOMAIN_NUMBER, TAG, `open link failed. Code is ${err.code}, message is ${err.message}`); 97 }) 98 } catch (paramError) { 99 hilog.error(DOMAIN_NUMBER, TAG, `Failed to start link. Code is ${paramError.code}, message is ${paramError.message}`); 100 } 101 }) 102 } 103 } 104 ``` 105 106## 启动其他应用的UIAbility并获取返回结果 107 1081. 将待跳转的应用安装到设备,在其对应UIAbility的[module.json5配置文件](../quick-start/module-configuration-file.md)中配置skills标签的entities字段、actions字段和uri字段: 109 110 - "actions"列表中包含"ohos.want.action.viewData"。 111 - "entities"列表中包含"entity.system.browsable"。 112 - "uris"列表中包含"scheme"为"https"且"domainVerify"为true的元素。uri的匹配规则参考[uri匹配](explicit-implicit-want-mappings.md#uri匹配规则), domainVerify为true代表开启域名检查,通过applinking匹配该应用时需经过配置的域名校验后才能匹配到。applinking域名配置具体可参考App Linking。 113 114 ```json 115 { 116 "module": { 117 // ... 118 "abilities": [ 119 { 120 // ... 121 "skills": [ 122 { 123 "entities": [ 124 "entity.system.browsable" 125 ], 126 "actions": [ 127 "ohos.want.action.viewData" 128 ], 129 "uris": [ 130 { 131 "scheme": "https", 132 "host": "www.example.com", 133 } 134 ], 135 "domainVerify": true 136 } 137 ] 138 } 139 ] 140 } 141 } 142 ``` 143 1442. 调用方通过[openLink](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextopenlink12)接口执行跳转,在接口入参需要传入转换后的link和配置[options](../reference/apis-ability-kit/js-apis-app-ability-openLinkOptions.md), 不再传入bundleName、moduleName和abilityName。系统会根据传入的link匹配到符合skills配置的应用。AbilityResult回调结果返回通过入参传入回调函数,在启动ability停止自身后返回给调用方的信息。启动成功和失败结果仍通过Promise返回。<br> 145 - 当options中的appLinkingOnly为true时,匹配到的应用会经过应用市场域名检查(需联网)返回域名校验检查的唯一匹配项或未匹配结果。 146 - 当options中的appLinkingOnly为false时,会优先尝试以AppLinking的方式拉起,如果没有匹配的应用则改为使用DeepLinking的方式拉起目标应用。 147 148 ```ts 149 import { common } from '@kit.AbilityKit'; 150 import OpenLinkOptions from '@ohos.app.ability.OpenLinkOptions'; 151 import { BusinessError } from '@ohos.base'; 152 import hilog from '@ohos.hilog'; 153 154 const TAG: string = '[UIAbilityComponentsOpenLink]'; 155 const DOMAIN_NUMBER: number = 0xFF00; 156 157 @Entry 158 @Component 159 struct Index { 160 build() { 161 Button('start link', { type: ButtonType.Capsule, stateEffect: true }) 162 .width('87%') 163 .height('5%') 164 .margin({ bottom: '12vp' }) 165 .onClick(() => { 166 let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 167 // 通过startAbility接口显式启动其他UIAbility,推荐使用openLink接口。 168 // let want: Want = { 169 // bundleName: "com.test.example", 170 // moduleName: "entry", 171 // abilityName: "EntryAbility" 172 // }; 173 // try { 174 // context.startAbilityForResult(want) 175 // .then((data) => { 176 // hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success. data:' + JSON.stringify(data)); 177 // }).catch((err: BusinessError) => { 178 // hilog.error(DOMAIN_NUMBER, TAG, `startAbility failed. Code is ${err.code}, message is ${err.message}`); 179 // }) 180 // } catch (paramError) { 181 // hilog.error(DOMAIN_NUMBER, TAG, `Failed to startAbility. Code is ${paramError.code}, message is ${paramError.message}`); 182 // } 183 let link: string = "https://www.example.com"; 184 let openLinkOptions: OpenLinkOptions = { 185 // 匹配的abilities选项是否需要通过AppLinking域名校验,匹配到唯一配置过的应用ability 186 appLinkingOnly: true, 187 // 同want中的parameter,用于传递的参数 188 parameters: {demo_key: "demo_value"} 189 }; 190 191 try { 192 context.openLink(link, openLinkOptions, (err, data) => { 193 // AbilityResult callback回调,仅在被拉起ability死亡时触发 194 hilog.info(DOMAIN_NUMBER, TAG, 'open link success. Callback result:' + JSON.stringify(data)); 195 }).then(() => { 196 hilog.info(DOMAIN_NUMBER, TAG, 'open link success.'); 197 }).catch((err: BusinessError) => { 198 hilog.error(DOMAIN_NUMBER, TAG, `open link failed. Code is ${err.code}, message is ${err.message}`); 199 }) 200 } catch (paramError) { 201 hilog.error(DOMAIN_NUMBER, TAG, `Failed to start link. Code is ${paramError.code}, message is ${paramError.message}`); 202 } 203 }) 204 } 205 } 206 ```