1# UIServiceExtensionContext (System API) 2 3The UIServiceExtensionContext module, inherited from [ExtensionContext](js-apis-inner-application-extensionContext.md), provides the context environment for a [UIServiceExtensionAbility](js-apis-app-ability-uiServiceExtensionAbility-sys.md). 4 5UIServiceExtensionContext provides access to a UIServiceExtensionAbility and APIs for operating the ability, for example, starting, terminating, connecting, and disconnecting ability. 6 7> **NOTE** 8> 9> - The initial APIs of this module are supported since API version 13. Newly added APIs will be marked with a superscript to indicate their earliest API version. 10> - The APIs of this module can be used only in the stage model. 11> - The APIs of this module must be used in the main thread, but not in sub-threads such as Worker and TaskPool. 12> - The APIs provided by this module are system APIs. 13 14## Modules to Import 15 16```ts 17import { common } from '@kit.AbilityKit'; 18``` 19 20## How to Use 21 22Before using the APIs of UIServiceExtensionContext, you must obtain the context through a child class instance [UIServiceExtensionAbility](js-apis-app-ability-uiServiceExtensionAbility-sys.md). 23 24**Example** 25 26```ts 27import { common, UIServiceExtensionAbility } from '@kit.AbilityKit'; 28 29class UIServiceExtAbility extends UIServiceExtensionAbility { 30 onCreate() { 31 let context:common.UIServiceExtensionContext = this.context; // Obtain the UIServiceExtensionContext. 32 } 33} 34``` 35 36 37## UIServiceExtensionContext.startAbility<sup>13+<sup> 38 39startAbility(want: Want, options?: StartOptions): Promise<void> 40 41Starts an ability. This API uses a promise to return the result. 42 43> **NOTE** 44> 45> For details about the startup rules for the components in the stage model, see [Component Startup Rules (Stage Model)](../../application-models/component-startup-rules.md). 46 47**System capability**: SystemCapability.Ability.AbilityRuntime.Core 48 49**System API**: This is a system API. 50 51**Parameters** 52 53| Name| Type| Read Only| Optional| Description| 54| -------- | -------- | -------- | -------- | -------- | 55| want | [Want](js-apis-app-ability-want.md) | Yes| No| Want information about the target ability, such as the ability name and bundle name.| 56| options | [StartOptions](js-apis-app-ability-startOptions.md) | Yes|Yes| Parameters used for starting the ability.| 57 58**Return value** 59 60| Type| Description| 61| -------- | -------- | 62| Promise<void> | Promise that returns no value.| 63 64**Error codes** 65 66For details about the error codes, see [Universal Error Codes](../errorcode-universal.md) and [Ability Error Codes](errorcode-ability.md). 67 68| ID| Error Message| 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**Example** 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 // Carry out normal service processing. 109 console.log('startAbility succeed'); 110 }) 111 .catch((error: BusinessError) => { 112 // Process service logic errors. 113 console.error(`startAbility failed, error.code: ${error.code}, error.message: ${error.message}`); 114 }); 115 } catch (paramError) { 116 // Process input parameter errors. 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 128Terminates this [UIServiceExtensionAbility](js-apis-app-ability-uiServiceExtensionAbility-sys.md). 129 130**System capability**: SystemCapability.Ability.AbilityRuntime.Core 131 132**System API**: This is a system API. 133 134**Return value** 135 136| Type| Description| 137| -------- | -------- | 138| Promise<void> | Promise that returns no value.| 139 140**Error codes** 141 142N/A 143 144**Example** 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 // Carry out normal service processing. 154 console.log('terminateSelf succeed'); 155 }).catch((error: BusinessError) => { 156 // Process service logic errors. 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 168Starts a [UIAbility](js-apis-app-ability-uiAbility.md) or [UIExtensionAbility](js-apis-app-ability-uiExtensionAbility.md) based on the type of the target ability. This API can be called only by applications running in the foreground. 169 170 171> **NOTE** 172> 173> For details about the startup rules for the components in the stage model, see [Component Startup Rules (Stage Model)](../../application-models/component-startup-rules.md). 174 175**System capability**: SystemCapability.Ability.AbilityRuntime.Core 176 177**System API**: This is a system API. 178 179**Parameters** 180 181| Name| Type| Read Only| Optional| Description| 182| -------- | -------- | -------- | -------- | -------- | 183| type | string | Yes| No| Type of the target ability.| 184| wantParam | Record<string, Object>| Yes| No| Want parameter.| 185| abilityStartCallback | [AbilityStartCallback](js-apis-inner-application-abilityStartCallback.md)| Yes| No| Callback.| 186 187**Return value** 188 189| Type| Description| 190| -------- | -------- | 191| Promise<void> | Promise that returns no value.| 192 193**Error codes** 194 195For details about the error codes, see [Universal Error Codes](../errorcode-universal.md) and [Ability Error Codes](errorcode-ability.md). 196 197| ID| Error Message| 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**Example** 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')], // Email address of the recipient. Multiple values are separated by commas (,). The array content is URL encoded using encodeURI(). 224 'cc': [encodeURI('xxx@example.com'), encodeURI('xxx@example.com')], // Email address of the CC recipient. Multiple values are separated by commas (,). The array content is URL encoded using encodeURI(). 225 'bcc': [encodeURI('xxx@example.com'), encodeURI('xxx@example.com')], // Email address of the BCC recipient. Multiple values are separated by commas (,). The array content is URL encoded using encodeURI(). 226 'subject': encodeURI('Email subject'), // Email subject. The content is URL encoded using encodeURI(). 227 'body': encodeURI('Email body'), // Email body. The content is URL encoded using encodeURI(). 228 'ability.params.stream':[encodeURI('attachment uri1'), encodeURI('attachment uri2')], // Attachment URIs. Multiple values are separated by commas (,). The array content is URL encoded using encodeURI(). 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 // Start a UIAbility or UIExtensionAbility based on the type of the target ability. 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 260Connects to a [UIExtensionAbility](js-apis-app-ability-uiExtensionAbility.md) and returns the connection ID. 261 262 263> **NOTE** 264> 265> For details about the startup rules for the components in the stage model, see [Component Startup Rules (Stage Model)](../../application-models/component-startup-rules.md). 266 267**System capability**: SystemCapability.Ability.AbilityRuntime.Core 268 269**System API**: This is a system API. 270 271**Parameters** 272 273| Name | Type | Read Only| Optional| Description | 274| -------------------- | ------------------------ | ---- | ---- |----------------- | 275| want | [Want](js-apis-app-ability-want.md) | Yes | No| Want parameter. | 276| options | [ConnectOptions](js-apis-inner-ability-connectOptions.md) | Yes|Yes | Connection options.| 277 278**Return value** 279 280| Type| Description| 281| -------- | -------- | 282| number | Connection ID.| 283 284**Error codes** 285 286For details about the error codes, see [Universal Error Codes](../errorcode-universal.md) and [Ability Error Codes](errorcode-ability.md). 287 288| ID| Error Message | 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**Example** 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 383Disconnects from a [UIExtensionAbility](js-apis-app-ability-uiExtensionAbility.md). This API is opposite to [connectServiceExtensionAbility](#uiserviceextensioncontextconnectserviceextensionability13). 384 385 386**System capability**: SystemCapability.Ability.AbilityRuntime.Core 387 388**System API**: This is a system API. 389 390**Parameters** 391 392| Name | Type | Read Only| Optional| Description | 393| -------------------- | ------------------------ | ---- | ----------------- | ----------------- | 394| connectionId | number | Yes | No| Connection ID returned by [connectServiceExtensionAbility](#uiserviceextensioncontextconnectserviceextensionability13).| 395 396 397**Return value** 398 399| Type | Description | 400| ------------------- | ---------------------------------| 401| Promise<void> | Promise that returns no value.| 402 403**Error codes** 404 405For details about the error codes, see [Universal Error Codes](../errorcode-universal.md) and [Ability Error Codes](errorcode-ability.md). 406 407| ID| Error Message| 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**Example** 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 is returned when connectServiceExtensionAbility is called and needs to be manually maintained. 439 context.disconnectServiceExtensionAbility(connectionId).then(() => { 440 hilog.info(DOMAIN_NUMBER, TAG, 'disconnectServiceExtensionAbility success'); 441 // The background service is disconnected. 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