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    ![效果示例图](./figures/start-express-panel.png)
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```