1# UIAbility Usage 2 3 4When using the [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md) component, you must specify a startup page and obtain the context, [UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md). 5 6 7## Specifying the Startup Page of UIAbility 8 9If no startup page is specified, a white screen occurs after the application is started. You can use [loadContent()](../reference/apis-arkui/arkts-apis-window-Window.md#loadcontent9) of [WindowStage](../reference/apis-arkui/arkts-apis-window-WindowStage.md) to set the startup page in the [onWindowStageCreate()](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#onwindowstagecreate) callback of the [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md) instance. 10 11 12```ts 13import { UIAbility } from '@kit.AbilityKit'; 14import { window } from '@kit.ArkUI'; 15 16export default class EntryAbility extends UIAbility { 17 onWindowStageCreate(windowStage: window.WindowStage): void { 18 // Main window is created. Set a main page for this ability. 19 windowStage.loadContent('pages/Index', (err, data) => { 20 // ... 21 }); 22 } 23 // ... 24} 25``` 26 27> **NOTE** 28> 29> When you create UIAbility in DevEco Studio, the UIAbility instance loads the **Index** page as its startup page. Therefore, you only need to replace the **Index** page path with the required startup page path. 30 31 32## Obtaining the Context of UIAbility 33 34The [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md) class has its own context, which is an instance of the [UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md) class. The [UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md) class has attributes such as **abilityInfo** and **currentHapModuleInfo**. UIAbilityContext can be used to obtain the UIAbility configuration information, such as the code path, bundle name, ability name, and environment status required by the application. It can also be used to obtain methods to operate the UIAbility instance, such as [startAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#startability), [connectServiceExtensionAbility()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#connectserviceextensionability), and [terminateSelf()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#terminateself). 35 36The [getHostContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#gethostcontext12) API enables you to obtain the context of the ability (either UIAbilityContext or [ExtensionContext](../reference/apis-ability-kit/js-apis-inner-application-extensionContext.md)) on the current page. 37 38- You can use **this.context** to obtain the context of a UIAbility instance. 39 40 ```ts 41 import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit'; 42 43 export default class EntryAbility extends UIAbility { 44 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 45 // Obtain the context of the UIAbility instance. 46 let context = this.context; 47 // ... 48 } 49 } 50 ``` 51 52- Import the context module and define the **context** variable in the component. 53 54 ```ts 55 import { common, Want } from '@kit.AbilityKit'; 56 57 @Entry 58 @Component 59 struct Page_EventHub { 60 private context = this.getUIContext().getHostContext() as common.UIAbilityContext; 61 62 startAbilityTest(): void { 63 let want: Want = { 64 // Want parameter information. 65 }; 66 this.context.startAbility(want); 67 } 68 69 // Page display. 70 build() { 71 // ... 72 } 73 } 74 ``` 75 76 You can also define variables after importing the context module but before using [UIAbilityContext](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md). 77 78 79 ```ts 80 import { common, Want } from '@kit.AbilityKit'; 81 82 @Entry 83 @Component 84 struct Page_UIAbilityComponentsBasicUsage { 85 startAbilityTest(): void { 86 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 87 let want: Want = { 88 // Want parameter information. 89 }; 90 context.startAbility(want); 91 } 92 93 // Page display. 94 build() { 95 // ... 96 } 97 } 98 ``` 99 100- To stop the [UIAbility](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md) instance after the service is not needed, call [terminateSelf()](../reference/apis-ability-kit/js-apis-inner-application-uiAbilityContext.md#terminateself). 101 102 ```ts 103 import { common } from '@kit.AbilityKit'; 104 import { BusinessError } from '@kit.BasicServicesKit'; 105 106 @Entry 107 @Component 108 struct Page_UIAbilityComponentsBasicUsage { 109 // Page display. 110 build() { 111 Column() { 112 //... 113 Button('FuncAbilityB') 114 .onClick(() => { 115 let context = this.getUIContext().getHostContext() as common.UIAbilityContext; 116 try { 117 context.terminateSelf((err: BusinessError) => { 118 if (err.code) { 119 // Process service logic errors. 120 console.error(`terminateSelf failed, code is ${err.code}, message is ${err.message}.`); 121 return; 122 } 123 // Carry out normal service processing. 124 console.info(`terminateSelf succeed.`); 125 }); 126 } catch (err) { 127 // Capture the synchronization parameter error. 128 let code = (err as BusinessError).code; 129 let message = (err as BusinessError).message; 130 console.error(`terminateSelf failed, code is ${code}, message is ${message}.`); 131 } 132 }) 133 } 134 } 135 } 136 ``` 137 138 139## Obtaining Information About the UIAbility Launcher 140 141When the launcher ability (UIAbilityA) starts the target ability (UIAbilityB) using **startAbility**, UIAbilityB can obtain information about UIAbilityA, such as its PID, bundle name, and ability name, through the [parameters](../reference/apis-ability-kit/js-apis-app-ability-want.md) parameter. 142 143 1441. Tap the **Start UIAbilityB** button in UIAbilityA to start UIAbilityB. 145 146 ```ts 147 import { common, Want } from '@kit.AbilityKit'; 148 import { BusinessError } from '@kit.BasicServicesKit'; 149 150 @Entry 151 @Component 152 struct Index { 153 @State message: string = 'Hello World'; 154 @State context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext; 155 156 build() { 157 Scroll() { 158 Column() { 159 Text(this.message) 160 .id('HelloWorld') 161 .fontSize(50) 162 .fontWeight(FontWeight.Bold) 163 .alignRules({ 164 center: { anchor: '__container__', align: VerticalAlign.Center }, 165 middle: { anchor: '__container__', align: HorizontalAlign.Center } 166 }) 167 .onClick(() => { 168 this.message = 'Welcome'; 169 }) 170 Button('terminateSelf').onClick(() => { 171 this.context.terminateSelf() 172 }) 173 174 Button('Start UIAbilityB').onClick((event: ClickEvent) => { 175 let want: Want = { 176 bundleName: this.context.abilityInfo.bundleName, 177 abilityName: 'UIAbilityB', 178 } 179 180 this.context.startAbility(want, (err: BusinessError) => { 181 if (err.code) { 182 console.error(`Failed to startAbility. Code: ${err.code}, message: ${err.message}.`); 183 } 184 }); 185 }) 186 } 187 } 188 } 189 } 190 ``` 191 1922. In the [onCreate](../reference/apis-ability-kit/js-apis-app-ability-uiAbility.md#oncreate) lifecycle of UIAbilityB, obtain and print the PID, bundle name, and ability name of UIAbilityA. 193 194 ```ts 195 import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 196 import { window } from '@kit.ArkUI'; 197 198 export default class UIAbilityB extends UIAbility { 199 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { 200 // The caller does not need to manually pass parameters. The system automatically passes the caller's information to the Want object. 201 console.log(`onCreate, callerPid: ${want.parameters?.['ohos.aafwk.param.callerPid']}.`); 202 console.log(`onCreate, callerBundleName: ${want.parameters?.['ohos.aafwk.param.callerBundleName']}.`); 203 console.log(`onCreate, callerAbilityName: ${want.parameters?.['ohos.aafwk.param.callerAbilityName']}.`); 204 } 205 206 onDestroy(): void { 207 console.log(`UIAbilityB onDestroy.`); 208 } 209 210 onWindowStageCreate(windowStage: window.WindowStage): void { 211 console.log(`Ability onWindowStageCreate.`); 212 213 windowStage.loadContent('pages/Index', (err) => { 214 if (err.code) { 215 console.error(`Failed to load the content, error code: ${err.code}, error msg: ${err.message}.`); 216 return; 217 } 218 console.log(`Succeeded in loading the content.`); 219 }); 220 } 221 } 222 ``` 223