1# UIServiceExtensionContext (系统接口) 2 3UIServiceExtensionContext模块是[UIServiceExtension](js-apis-app-ability-uiServiceExtensionAbility-sys.md)的上下文环境,继承自[ExtensionContext](js-apis-inner-application-extensionContext.md)。 4 5UIServiceExtensionContext模块提供访问[UIServiceExtension](js-apis-app-ability-uiServiceExtensionAbility-sys.md)特定资源以及具有的能力,包括启动、停止、绑定、解绑Ability。 6 7> **说明:** 8> 9> - 本模块首批接口从API version 13开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 10> - 本模块接口仅可在Stage模型下使用。 11> - 本模块接口需要在主线程中使用,不要在Worker、TaskPool等子线程中使用。 12> - 本模块接口为系统接口。 13 14## 导入模块 15 16```ts 17import { common } from '@kit.AbilityKit'; 18``` 19 20## 使用说明 21 22在使用UIServiceExtensionContext的功能前,需要通过[UIServiceExtension](js-apis-app-ability-uiServiceExtensionAbility-sys.md)子类实例获取上下文环境。 23 24**示例:** 25 26```ts 27import { common, UIServiceExtensionAbility } from '@kit.AbilityKit'; 28 29class UIServiceExtAbility extends UIServiceExtensionAbility { 30 onCreate() { 31 let context:common.UIServiceExtensionContext = this.context ; // 获取UIServiceExtensionContext 32 } 33} 34``` 35 36 37## UIServiceExtensionContext.startAbility<sup>13+<sup> 38 39startAbility(want: Want, options?: StartOptions): Promise<void> 40 41启动Ability,结果以Promise的形式返回。 42 43> **说明:** 44> 45> 组件启动规则详见:[组件启动规则(Stage模型)](../../application-models/component-startup-rules.md)。 46 47**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 48 49**系统接口**:此接口为系统接口。 50 51**参数:** 52 53| 参数名 | 类型 | 只读 | 可选 | 说明 | 54| -------- | -------- | -------- | -------- | -------- | 55| want | [Want](js-apis-app-ability-want.md) | 是 | 否 | Want类型参数,传入需要启动的ability的信息,如Ability名称,Bundle名称等。 | 56| options | [StartOptions](js-apis-app-ability-startOptions.md) | 是 |是 | 启动Ability所携带的参数。 | 57 58**返回值:** 59 60| 类型 | 说明 | 61| -------- | -------- | 62| Promise<void> | Promise对象。无返回结果的Promise对象。 | 63 64**错误码:** 65 66以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 67 68| 错误码ID | 错误信息 | 69| ------- | -------- | 70| 201 | The application does not have permission to call the interface. | 71| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 72| 16000001 | The specified ability does not exist. | 73| 16000002 | Incorrect ability type. | 74| 16000004 | Failed to start the invisible ability. | 75| 16000005 | The specified process does not have the permission. | 76| 16000006 | Cross-user operations are not allowed. | 77| 16000008 | The crowdtesting application expires. | 78| 16000009 | An ability cannot be started or stopped in Wukong mode. | 79| 16000010 | The call with the continuation flag is forbidden. | 80| 16000011 | The context does not exist. | 81| 16000012 | The application is controlled. | 82| 16000013 | The application is controlled by EDM. | 83| 16000019 | Can not match any component. | 84| 16000050 | Internal error. | 85| 16000053 | The ability is not on the top of the UI. | 86| 16000055 | Installation-free timed out. | 87| 16200001 | The caller has been released. | 88 89**示例:** 90 91```ts 92import { UIServiceExtensionAbility, Want, StartOptions } from '@kit.AbilityKit'; 93import { BusinessError } from '@kit.BasicServicesKit'; 94 95class UIEntryAbility extends UIServiceExtensionAbility { 96 onCreate() { 97 let want: Want = { 98 bundleName: 'com.example.myapp', 99 abilityName: 'MyAbility' 100 }; 101 let options: StartOptions = { 102 windowMode: 0, 103 }; 104 105 try { 106 this.context.startAbility(want, options) 107 .then((data: void) => { 108 // 执行正常业务 109 console.log('startAbility succeed'); 110 }) 111 .catch((error: BusinessError) => { 112 // 处理业务逻辑错误 113 console.error(`startAbility failed, error.code: ${error.code}, error.message: ${error.message}`); 114 }); 115 } catch (paramError) { 116 // 处理入参错误异常 117 console.error(`error.code: ${paramError.code}, error.message: ${paramError.message}`); 118 } 119 } 120} 121``` 122 123 124## UIServiceExtensionContext.terminateSelf<sup>13+<sup> 125 126terminateSelf(): Promise<void> 127 128销毁[UIServiceExtension](js-apis-app-ability-uiServiceExtensionAbility-sys.md)。 129 130**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 131 132**系统接口**:此接口为系统接口。 133 134**返回值:** 135 136| 类型 | 说明 | 137| -------- | -------- | 138| Promise<void> | Promise对象。无返回结果的Promise对象。 | 139 140**错误码:** 141 142无。 143 144**示例:** 145 146```ts 147import { UIServiceExtensionAbility } from '@kit.AbilityKit'; 148import { BusinessError } from '@kit.BasicServicesKit'; 149 150class UIEntryAbility extends UIServiceExtensionAbility { 151 onCreate() { 152 this.context.terminateSelf().then(() => { 153 // 执行正常业务 154 console.log('terminateSelf succeed'); 155 }).catch((error: BusinessError) => { 156 // 处理业务逻辑错误 157 console.error(`terminateSelf failed, error.code: ${error.code}, error.message: ${error.message}`); 158 }); 159 } 160} 161``` 162 163## UIServiceExtensionContext.startAbilityByType<sup>13+<sup> 164 165startAbilityByType(type: string, wantParam: Record<string, Object>, 166 abilityStartCallback: AbilityStartCallback): Promise<void> 167 168按目标ability的类型启动[UIAbility](js-apis-app-ability-uiAbility.md)或[UIExtensionAbility](js-apis-app-ability-uiExtensionAbility.md)。仅支持处于前台的应用调用。 169 170 171> **说明:** 172> 173> 组件启动规则详见:[组件启动规则(Stage模型)](../../application-models/component-startup-rules.md)。 174 175**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 176 177**系统接口**:此接口为系统接口。 178 179**参数:** 180 181| 参数名 | 类型 | 只读 | 可选 | 说明 | 182| -------- | -------- | -------- | -------- | -------- | 183| type | string | 是 | 否 | 目标ability类型。 | 184| wantParam | Record<string, Object>| 是 | 否 | want 参数。 | 185| abilityStartCallback | [AbilityStartCallback](js-apis-inner-application-abilityStartCallback.md)| 是 | 否| 回调。 | 186 187**返回值:** 188 189| 类型 | 说明 | 190| -------- | -------- | 191| Promise<void> | Promise对象。无返回结果的Promise对象。 | 192 193**错误码:** 194 195以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 196 197| 错误码ID | 错误信息 | 198| ------- | -------- | 199| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 200| 16000050 | Internal error. | 201 202**示例:** 203 204```ts 205import { common } from '@kit.AbilityKit'; 206import { BusinessError } from '@kit.BasicServicesKit'; 207 208const TAG: string = '[Extension_Sub] '; 209 210@Entry 211@Component 212struct SubIndex { 213 build() { 214 Row() { 215 Column() { 216 Button("startAbilityByType") 217 .fontSize(10) 218 .fontWeight(FontWeight.Bold) 219 .onClick(() => { 220 let context = getContext(this) as common.UIServiceExtensionContext; 221 let startWant: Record<string, Object> = { 222 'sceneType': 1, 223 'email': [encodeURI('xxx@example.com'), encodeURI('xxx@example.com')], // 收件人邮箱地址,多值以逗号分隔,对数组内容使用encodeURI()方法进行url编码 224 'cc': [encodeURI('xxx@example.com'), encodeURI('xxx@example.com')], // 抄收人邮箱地址,多值以逗号分隔,对数组内容使用encodeURI()方法进行url编码 225 'bcc': [encodeURI('xxx@example.com'), encodeURI('xxx@example.com')], // 密送人邮箱地址,多值以逗号分隔,对数组内容使用encodeURI()方法进行url编码 226 'subject': encodeURI('邮件主题'), // 邮件主题,对内容使用encodeURI()方法进行url编码 227 'body': encodeURI('邮件正文'), // 邮件正文,对内容使用encodeURI()方法进行url编码 228 'ability.params.stream': [encodeURI('附件uri1'), encodeURI('附件uri2')], // 附件uri,多值以逗号分隔,对数组内容使用encodeURI()方法进行url编码 229 'ability.want.params.uriPermissionFlag': 1 230 }; 231 let abilityStartCallback: common.AbilityStartCallback = { 232 onError: (code: number, name: string, message: string) => { 233 console.log(TAG + `code: ${code} name:${name} message:${message}`); 234 } 235 }; 236 try { 237 // 按目标ability的类型启动UIAbility或UIExtensionAbility 238 context.startAbilityByType("mail", startWant, abilityStartCallback) 239 .then(() => { 240 console.log(TAG + `Successed in windows starting ability`); 241 }).catch((err: BusinessError) => { 242 console.log(TAG + `Failed to windows starting ability, Code is ${err.code}, message is ${err.message}`); 243 }) 244 } catch (err) { 245 console.log(TAG + `Failed to windows starting ability, Code is ${err.code}, message is ${err.message}`); 246 } 247 }) 248 } 249 .width('100%') 250 } 251 .height('100%') 252 } 253} 254``` 255 256## UIServiceExtensionContext.connectServiceExtensionAbility<sup>13+<sup> 257 258connectServiceExtensionAbility(want: Want, options: ConnectOptions): number 259 260连接到[UIExtensionAbility](js-apis-app-ability-uiExtensionAbility.md),返回连接id。 261 262 263> **说明:** 264> 265> 组件启动规则详见:[组件启动规则(Stage模型)](../../application-models/component-startup-rules.md)。 266 267**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 268 269**系统接口**:此接口为系统接口。 270 271**参数:** 272 273| 参数名 | 类型 | 只读 | 可选 | 说明 | 274| -------------------- | ------------------------ | ---- | ---- |----------------- | 275| want | [Want](js-apis-app-ability-want.md) | 是 | 否 | Want 参数。 | 276| options | [ConnectOptions](js-apis-inner-ability-connectOptions.md) | 是 |是 | 连接选项。 | 277 278**返回值:** 279 280| 类型 | 说明 | 281| -------- | -------- | 282| number | 返回连接id。 | 283 284**错误码:** 285 286以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 287 288| 错误码ID | 错误信息 | 289| -------- | --- | 290| 201 | Not system application. | 291| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 292| 16000001 | The specified ability does not exist. | 293| 16000002 | Incorrect ability type. | 294| 16000004 | Failed to start the invisible ability. | 295| 16000005 | The specified process does not have the permission. | 296| 16000006 | Cross-user operations are not allowed. | 297| 16000008 | The crowdtesting application expires. | 298| 16000011 | The context does not exist. | 299| 16000050 | Internal error. | 300| 16000053 | The ability is not on the top of the UI. | 301| 16000055 | Installation-free timed out. | 302 303 304**示例:** 305 306```ts 307import { common, Want } from '@kit.AbilityKit'; 308import { rpc } from '@kit.IPCKit'; 309import { promptAction } from '@kit.ArkUI'; 310import { hilog } from '@kit.PerformanceAnalysisKit'; 311// The client needs to import idl_service_ext_proxy.ts provided by the server to the local project. 312import IdlServiceExtProxy from '../IdlServiceExt/idl_service_ext_proxy'; 313 314const TAG: string = '[Page_ServiceExtensionAbility]'; 315const DOMAIN_NUMBER: number = 0xFF00; 316 317let connectionId: number; 318let want: Want = { 319 deviceId: '', 320 bundleName: 'com.samples.stagemodelabilitydevelop', 321 abilityName: 'ServiceExtAbility' 322}; 323 324let options: common.ConnectOptions = { 325 onConnect(elementName, remote: rpc.IRemoteObject): void { 326 hilog.info(DOMAIN_NUMBER, TAG, 'onConnect callback'); 327 if (remote === null) { 328 hilog.info(DOMAIN_NUMBER, TAG, `onConnect remote is null`); 329 return; 330 } 331 let serviceExtProxy: IdlServiceExtProxy = new IdlServiceExtProxy(remote); 332 // Communication is carried out by API calling, without exposing RPC details. 333 serviceExtProxy.processData(1, (errorCode: number, retVal: number) => { 334 hilog.info(DOMAIN_NUMBER, TAG, `processData, errorCode: ${errorCode}, retVal: ${retVal}`); 335 }); 336 serviceExtProxy.insertDataToMap('theKey', 1, (errorCode: number) => { 337 hilog.info(DOMAIN_NUMBER, TAG, `insertDataToMap, errorCode: ${errorCode}`); 338 }) 339 }, 340 onDisconnect(elementName): void { 341 hilog.info(DOMAIN_NUMBER, TAG, 'onDisconnect callback'); 342 }, 343 onFailed(code: number): void { 344 hilog.info(DOMAIN_NUMBER, TAG, 'onFailed callback', JSON.stringify(code)); 345 } 346}; 347@Entry 348@Component 349struct Page_UIServiceExtensionAbility { 350 build() { 351 Column() { 352 //... 353 List({ initialIndex: 0 }) { 354 ListItem() { 355 Row() { 356 //... 357 } 358 .onClick(() => { 359 let context: common.UIServiceExtensionContext = getContext(this) as common.UIServiceExtensionContext; 360 // The ID returned after the connection is set up must be saved. The ID will be used for disconnection. 361 connectionId = context.connectServiceExtensionAbility(want, options); 362 // The background service is connected. 363 promptAction.showToast({ 364 message: $r('app.string.SuccessfullyConnectBackendService') 365 }); 366 // connectionId = context.connectAbility(want, options); 367 hilog.info(DOMAIN_NUMBER, TAG, `connectionId is : ${connectionId}`); 368 }) 369 } 370 //... 371 } 372 //... 373 } 374 //... 375 } 376} 377``` 378 379## UIServiceExtensionContext.disconnectServiceExtensionAbility<sup>13+<sup> 380 381disconnectServiceExtensionAbility(connectionId: number): Promise<void> 382 383断开与[UIExtensionAbility](js-apis-app-ability-uiExtensionAbility.md)的连接, 与[connectServiceExtensionAbility](#uiserviceextensioncontextconnectserviceextensionability13)功能相反。 384 385 386**系统能力**:SystemCapability.Ability.AbilityRuntime.Core 387 388**系统接口**:此接口为系统接口。 389 390**参数:** 391 392| 参数名 | 类型 | 只读 | 可选 | 说明 | 393| -------------------- | ------------------------ | ---- | ----------------- | ----------------- | 394| connectionId | number | 是 | 否 | 从[connectServiceExtensionAbility](#uiserviceextensioncontextconnectserviceextensionability13)接口返回的连接Id。 | 395 396 397**返回值:** 398 399| 类型 | 说明 | 400| ------------------- | ---------------------------------| 401| Promise<void> | Promise对象。无返回结果的Promise对象。 | 402 403**错误码:** 404 405以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 406 407| 错误码ID | 错误信息 | 408| -------- | --------------------- | 409| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 410| 16000011 | The context does not exist. | 411| 16000050 | Internal error. | 412 413**示例:** 414 415```ts 416import { common } from '@kit.AbilityKit'; 417import { promptAction } from '@kit.ArkUI'; 418import { hilog } from '@kit.PerformanceAnalysisKit'; 419import { BusinessError } from '@kit.BasicServicesKit'; 420 421const TAG: string = '[Page_ServiceExtensionAbility]'; 422const DOMAIN_NUMBER: number = 0xFF00; 423 424let connectionId: number; 425@Entry 426@Component 427struct Page_UIServiceExtensionAbility { 428 build() { 429 Column() { 430 //... 431 List({ initialIndex: 0 }) { 432 ListItem() { 433 Row() { 434 //... 435 } 436 .onClick(() => { 437 let context: common.UIServiceExtensionContext = getContext(this) as common.UIServiceExtensionContext; 438 // connectionId为调用connectServiceExtensionAbility接口时的返回值,需开发者自行维护 439 context.disconnectServiceExtensionAbility(connectionId).then(() => { 440 hilog.info(DOMAIN_NUMBER, TAG, 'disconnectServiceExtensionAbility success'); 441 // 成功断连后台服务 442 promptAction.showToast({ 443 message: $r('app.string.SuccessfullyDisconnectBackendService') 444 }); 445 }).catch((error: BusinessError) => { 446 hilog.error(DOMAIN_NUMBER, TAG, 'disconnectServiceExtensionAbility failed'); 447 }); 448 }) 449 } 450 //... 451 } 452 //... 453 } 454 //... 455 } 456} 457``` 458