• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# AppServiceExtensionContext (应用后台服务扩展组件上下文)
2<!--Kit: Ability Kit-->
3<!--Subsystem: Ability-->
4<!--Owner: @yewei0794-->
5<!--Designer: @jsjzju-->
6<!--Tester: @lixueqing513-->
7<!--Adviser: @huipeizi-->
8
9AppServiceExtensionContext模块是[AppServiceExtensionAbility](../apis-ability-kit/js-apis-app-ability-appServiceExtensionAbility.md)的上下文环境,继承自[ExtensionContext](js-apis-inner-application-extensionContext.md)。
10
11AppServiceExtensionContext提供了连接、断开ServiceExtensionAbility(系统应用后台服务扩展组件)的能力,以及AppServiceExtensionAbility终止自身的能力。这里的ServiceExtensionAbility只能由系统应用开发,支持三方应用连接。
12
13
14> **说明:**
15>
16>  - 本模块首批接口从API version 20开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
17>  - 本模块接口仅可在Stage模型下使用。
18>  - 本模块接口需要在主线程中使用,不要在Worker、TaskPool等子线程中使用。
19
20## 导入模块
21
22```ts
23import { common } from '@kit.AbilityKit';
24```
25
26## 使用说明
27
28在使用AppServiceExtensionContext的功能前,需要通过AppServiceExtensionAbility子类实例获取。
29
30**示例:**
31
32```ts
33import { AppServiceExtensionAbility } from '@kit.AbilityKit';
34
35export default class AppServiceExtension extends AppServiceExtensionAbility {
36  onCreate(want: Want) {
37    let context = this.context; // 获取AppServiceExtensionContext
38  }
39}
40```
41
42## AppServiceExtensionContext
43
44### startAbility
45
46startAbility(want: Want, options?: StartOptions): Promise&lt;void&gt;
47
48启动UIAbility。仅支持在主线程调用。使用Promise异步回调。
49
50**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
51
52**参数:**
53
54| 参数名 | 类型 | 必填 | 说明 |
55| -------- | -------- | -------- | -------- |
56| want | [Want](js-apis-app-ability-want.md)  | 是 | Want类型参数,传入需要启动的Ability的信息,如Ability名称、Bundle名称等。 |
57| options | [StartOptions](js-apis-app-ability-startOptions.md) | 否 | 启动Ability所携带的参数。 |
58
59**返回值:**
60
61| 类型 | 说明 |
62| -------- | -------- |
63| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
64
65**错误码:**
66
67以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。
68
69| 错误码ID | 错误信息 |
70| ------- | -------- |
71| 201 | The application does not have permission to call the interface. |
72| 16000001 | The specified ability does not exist. |
73| 16000002 | Incorrect ability type. |
74| 16000004 | Cannot start an invisible component. |
75| 16000005 | The specified process does not have the permission. |
76| 16000008 | The crowdtesting application expires. |
77| 16000009 | An ability cannot be started or stopped in Wukong mode. |
78| 16000010 | The call with the continuation and prepare continuation flag is forbidden.        |
79| 16000011 | The context does not exist.        |
80| 16000012 | The application is controlled.        |
81| 16000013 | The application is controlled by EDM.       |
82| 16000019 | No matching ability is found. |
83| 16000050 | Internal error. |
84| 16000055 | Installation-free timed out. |
85| 16000071 | App clone is not supported. |
86| 16000072 | App clone or multi-instance is not supported. |
87| 16000073 | The app clone index is invalid. |
88| 16000076 | The app instance key is invalid. |
89| 16000077 | The number of app instances reaches the limit. |
90| 16000078 | The multi-instance is not supported. |
91| 16000079 | The APP_INSTANCE_KEY cannot be specified. |
92| 16000080 | Creating a new instance is not supported. |
93
94**示例:**
95
96```ts
97import { AppServiceExtensionAbility, Want, StartOptions } from '@kit.AbilityKit';
98import { BusinessError } from '@kit.BasicServicesKit';
99
100export default class MyAppServiceExtensionAbility extends AppServiceExtensionAbility {
101  onCreate(want: Want) {
102    let wantInfo: Want = {
103      bundleName: 'com.example.myapplication',
104      abilityName: 'EntryAbility'
105    };
106    let options: StartOptions = {
107      displayId: 0
108    };
109
110    try {
111      this.context.startAbility(wantInfo, options)
112        .then(() => {
113          // 执行正常业务
114          console.info('startAbility succeed');
115        })
116        .catch((err: BusinessError) => {
117          // 处理业务逻辑错误
118          console.error(`startAbility failed, code is ${err.code}, message is ${err.message}`);
119        });
120    } catch (err) {
121      // 处理入参错误异常
122      let code = (err as BusinessError).code;
123      let message = (err as BusinessError).message;
124      console.error(`startAbility failed, code is ${code}, message is ${message}`);
125    }
126  }
127}
128```
129
130### connectServiceExtensionAbility
131
132connectServiceExtensionAbility(want: Want, callback: ConnectOptions): number
133
134将当前AppServiceExtensionAbility连接到一个ServiceExtensionAbility,通过返回的proxy与ServiceExtensionAbility进行通信,以使用ServiceExtensionAbility对外提供的能力。仅支持在主线程调用。
135
136**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
137
138**参数:**
139
140| 参数名 | 类型 | 必填 | 说明 |
141| -------- | -------- | -------- | -------- |
142| want | [Want](js-apis-app-ability-want.md)  | 是 | Want类型参数,传入需要连接的Ability的信息,如Ability名称,Bundle名称等。 |
143| callback | [ConnectOptions](js-apis-inner-ability-connectOptions.md) | 是 | ConnectOptions类型的回调函数,返回服务连接成功、连接失败、断开的信息。 |
144
145**返回值:**
146
147| 类型 | 说明 |
148| -------- | -------- |
149| number | 返回连接id,客户端可以通过[disconnectServiceExtensionAbility](#disconnectserviceextensionability)传入该连接id来断开连接。 |
150
151**错误码:**
152
153以下错误码详细介绍请参考[元能力子系统错误码](errorcode-ability.md)。
154
155| 错误码ID | 错误信息 |
156| ------- | -------- |
157| 16000001 | The specified ability does not exist. |
158| 16000002 | Incorrect ability type. |
159| 16000004 | Cannot start an invisible component. |
160| 16000005 | The specified process does not have the permission. |
161| 16000006 | Cross-user operations are not allowed. |
162| 16000008 | The crowdtesting application expires. |
163| 16000011 | The context does not exist.        |
164| 16000050 | Internal error. |
165
166**示例:**
167
168```ts
169import { AppServiceExtensionAbility, Want, common } from '@kit.AbilityKit';
170import { rpc } from '@kit.IPCKit';
171import { BusinessError } from '@kit.BasicServicesKit';
172import { hilog } from '@kit.PerformanceAnalysisKit';
173
174let commRemote: rpc.IRemoteObject | null = null; // 断开连接时需要释放
175const TAG: string = '[AppServiceExtensionAbility]';
176
177export default class AppServiceExtension extends AppServiceExtensionAbility {
178  connection: number = 0;
179
180  onCreate(localWant: Want) {
181    let want: Want = {
182      bundleName: 'com.example.myapp',
183      abilityName: 'MyAbility'
184    };
185    let callback: common.ConnectOptions = {
186      onConnect(elementName, remote) {
187        commRemote = remote;
188        hilog.info(0x0000, TAG, '----------- onConnect -----------');
189      },
190      onDisconnect(elementName) {
191        hilog.info(0x0000, TAG, '----------- onDisconnect -----------');
192      },
193      onFailed(code) {
194        hilog.error(0x0000, TAG, '----------- onFailed -----------');
195      }
196    };
197
198
199    try {
200      this.connection = this.context.connectServiceExtensionAbility(want, callback);
201    } catch (paramError) {
202      commRemote = null;
203      // 处理入参错误异常
204      hilog.error(0x0000, TAG, `error.code: ${(paramError as BusinessError).code}, error.message: ${(paramError as BusinessError).message}`);
205    }
206  }
207
208  onDestroy(): void {
209    this.context.disconnectServiceExtensionAbility(this.connection).then(() => {
210      commRemote = null;
211      // 执行正常业务
212      hilog.info(0x0000, TAG, '----------- disconnectServiceExtensionAbility success -----------');
213    })
214      .catch((error: BusinessError) => {
215        commRemote = null;
216        // 处理业务逻辑错误
217        hilog.error(0x0000, TAG, `disconnectServiceExtensionAbility failed, error.code: ${error.code}, error.message: ${error.message}`);
218      });
219  }
220}
221```
222
223### disconnectServiceExtensionAbility
224
225disconnectServiceExtensionAbility(connection: number): Promise&lt;void&gt;
226
227将AppServiceExtensionAbility与已连接的ServiceExtensionAbility断开连接。仅支持在主线程调用。使用Promise异步回调。
228
229**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
230
231**参数:**
232
233| 参数名 | 类型 | 必填 | 说明 |
234| -------- | -------- | -------- | -------- |
235| connection | number | 是 | 在[connectServiceExtensionAbility](#connectserviceextensionability)中返回的连接id。 |
236
237**返回值:**
238
239| 类型 | 说明 |
240| -------- | -------- |
241| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
242
243**错误码:**
244
245以下错误码详细介绍请参考[元能力子系统错误码](errorcode-ability.md)。
246
247| 错误码ID | 错误信息 |
248| ------- | -------- |
249| 16000011 | The context does not exist.        |
250| 16000050 | Internal error. |
251
252**示例:**
253
254参见[connectServiceExtensionAbility](#connectserviceextensionability)。
255
256### terminateSelf
257
258terminateSelf(): Promise&lt;void&gt;
259
260销毁AppServiceExtensionAbility自身。仅支持在主线程调用。使用Promise异步回调。
261
262**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
263
264**返回值:**
265
266| 类型 | 说明 |
267| -------- | -------- |
268| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
269
270**错误码:**
271
272以下错误码详细介绍请参考[元能力子系统错误码](errorcode-ability.md)。
273
274| 错误码ID | 错误信息 |
275| ------- | -------------------------------- |
276| 16000009 | An ability cannot be started or stopped in Wukong mode. |
277| 16000011 | The context does not exist.        |
278| 16000050 | Internal error. |
279
280**示例:**
281
282```ts
283import { AppServiceExtensionAbility } from '@kit.AbilityKit';
284import { BusinessError } from '@kit.BasicServicesKit';
285import { hilog } from '@kit.PerformanceAnalysisKit';
286
287const TAG: string = '[AppServiceExtensionAbility]';
288
289export default class AppServiceExtension extends AppServiceExtensionAbility {
290  onCreate(want: Want) {
291    this.context.terminateSelf().then(() => {
292      // 执行正常业务
293      hilog.info(0x0000, TAG, '----------- terminateSelf succeed -----------');
294    }).catch((error: BusinessError) => {
295      // 处理业务逻辑错误
296      hilog.error(0x0000, TAG, `terminateSelf failed, error.code: ${error.code}, error.message: ${error.message}`);
297    });
298  }
299}
300```