1# 拉起快递类应用(startAbilityByType) 2 3本章节介绍如何拉起快递类应用扩展面板。 4 5例如,在消息类App中,用户收到快递单号,应用能够识别快递单号信息并提供快递查询的链接。用户点击链接后,应用将通过调用[UIAbilityContext.startAbilityByType](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartabilitybytype11)或[UIExtensionContentSession.startAbilityByType](../reference/apis-ability-kit/js-apis-app-ability-uiExtensionContentSession.md#uiextensioncontentsessionstartabilitybytype11)接口,拉起快递类应用的扩展面板。面板上将展示设备上所有支持快递查询的应用,供用户选择并跳转至所需应用。 6 7## 快递类应用扩展面板参数说明 8 9startAbilityByType接口中type字段为express,支持查询快递意图,对应的wantParam参数如下: 10 11 12| 参数名 | 类型 | 必填 | 说明 | 13| --------- | ------ | ---- | -------------------------------------- | 14| sceneType | number | 否 | 意图场景,表明本次请求对应的操作意图。默认为1,查询快递填场景填1或不填。 | 15| expressNo | string | 是 | 快递单号。 | 16 17 18## 拉起方开发步骤 19 201. 导入相关模块。 21 ```ts 22 import { common } from '@kit.AbilityKit'; 23 ``` 242. 构造接口参数并调用startAbilityByType接口。 25 26 ```ts 27 let context = getContext(this) as common.UIAbilityContext; 28 let wantParam: Record<string, Object> = { 29 'sceneType': 1, 30 'expressNo': 'SF123456' 31 }; 32 let abilityStartCallback: common.AbilityStartCallback = { 33 onError: (code: number, name: string, message: string) => { 34 console.log(`onError code ${code} name: ${name} message: ${message}`); 35 }, 36 onResult: (result)=>{ 37 console.log(`onResult result: ${JSON.stringify(result)}`); 38 } 39 } 40 41 context.startAbilityByType("express", wantParam, abilityStartCallback, 42 (err) => { 43 if (err) { 44 console.error(`startAbilityByType fail, err: ${JSON.stringify(err)}`); 45 } else { 46 console.log(`success`); 47 } 48 }); 49 50 ``` 51 52 效果示例图: 53  54 55## 目标方开发步骤 56 571. 在module.json5中配置[uris](../quick-start/module-configuration-file.md#skills标签): 58 1. 设置linkFeature属性以声明当前应用支持的特性功能,从而系统可以从设备已安装应用中找到当前支持该特性的应用,取值范围如下: 59 | 取值 | 含义 | 60 | ------------ | -------------------- | 61 | QueryExpress | 声明应用支持快递查询。 | 62 2. 设置scheme、host、port、path/pathStartWith属性,与Want中URI相匹配,以便区分不同功能。 63 ```json 64 { 65 "abilities": [ 66 { 67 "skills": [ 68 { 69 "uris": [ 70 { 71 "scheme": "express", 72 "host": "queryExpress", 73 "path": "", 74 "linkFeature": "QueryExpress" 75 } 76 ] 77 } 78 ] 79 } 80 ] 81 } 82 ``` 83 842. 解析参数并做对应处理。 85 86 ```ts 87 UIAbility.onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void 88 ``` 89 90 在参数**want.uri**中会携带目标方配置的linkFeature对应的uri; 91 92 在参数**want.parameters**中会携带Caller方传入的参数,如下所示: 93 94 | 参数名 | 类型 | 必填 | 说明 | 95 | --------- | ------ | ---- | -------- | 96 | expressNo | string | 是 | 快递单号。 | 97 98 99 100**完整示例:** 101 102```ts 103import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 104import { hilog } from '@kit.PerformanceAnalysisKit'; 105import { window } from '@kit.ArkUI'; 106 107const TAG = 'EntryAbility' 108 109export default class EntryAbility extends UIAbility { 110 windowStage: window.WindowStage | null = null; 111 112 uri?: string; 113 expressNo?: string; 114 115 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 116 hilog.info(0x0000, TAG, `onCreate, want=${JSON.stringify(want)}`); 117 super.onCreate(want, launchParam); 118 this.parseWant(want); 119 } 120 121 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void { 122 hilog.info(0x0000, TAG, `onNewWant, want=${JSON.stringify(want)}`); 123 super.onNewWant(want, launchParam); 124 this.parseWant(want); 125 if (!this.windowStage) { 126 hilog.error(0x0000, TAG, 'windowStage is null'); 127 this.context.terminateSelf(); 128 return; 129 } 130 this.loadPage(this.windowStage); 131 } 132 133 private parseWant(want: Want): void { 134 this.uri = want.uri as string | undefined; 135 this.expressNo = want.parameters?.expressNo as string | undefined; 136 } 137 138 private loadPage(windowStage: window.WindowStage): void { 139 hilog.info(0x0000, TAG, `loadPage, uri=${this.uri}`); 140 if (this.uri === 'express://queryExpress') { 141 // 构建快递查询参数 142 const storage: LocalStorage = new LocalStorage({ 143 "expressNo": this.expressNo 144 } as Record<string, Object>); 145 // 拉起快递查询页面 146 windowStage.loadContent('pages/QueryExpressPage', storage) 147 } else { 148 // 默认拉起首页 149 windowStage.loadContent('pages/Index', (err) => { 150 if (err.code) { 151 hilog.error(0x0000, TAG, 'Failed to load the content. Cause: %{public}s', 152 JSON.stringify(err) ?? ''); 153 return; 154 } 155 hilog.info(0x0000, TAG, 'Succeeded in loading the content.'); 156 }); 157 } 158 } 159 160 onDestroy(): void { 161 hilog.info(0x0000, TAG, `onDestroy`); 162 } 163 164 onWindowStageCreate(windowStage: window.WindowStage): void { 165 hilog.info(0x0000, TAG, `onWindowStageCreate`); 166 this.windowStage = windowStage; 167 this.loadPage(this.windowStage); 168 } 169 170 onWindowStageDestroy(): void { 171 hilog.info(0x0000, TAG, '%{public}s', 'Ability onWindowStageDestroy'); 172 } 173 174 onForeground(): void { 175 hilog.info(0x0000, TAG, '%{public}s', 'Ability onForeground'); 176 } 177 178 onBackground(): void { 179 hilog.info(0x0000, TAG, '%{public}s', 'Ability onBackground'); 180 } 181} 182```