1# @ohos.app.ability.UIAbility (UIAbility) 2 3UIAbility是包含UI界面的应用组件,继承自[Ability](js-apis-app-ability-ability.md),提供组件创建、销毁、前后台切换等生命周期回调,同时也具备组件协同的能力,组件协同主要提供如下常用功能: 4 5- [Caller](#caller):由[startAbilityByCall](js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartabilitybycall)接口返回,CallerAbility(调用者)可使用Caller与CalleeAbility(被调用者)进行通信。 6- [Callee](#callee):UIAbility的内部对象,CalleeAbility(被调用者)可以通过Callee与Caller进行通信。 7 8各类Ability的继承关系详见[继承关系说明](./js-apis-app-ability-ability.md#ability的继承关系说明)。 9 10> **说明:** 11> 12> 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 13> 14> 本模块接口仅可在Stage模型下使用。 15 16## 导入模块 17 18```ts 19import { UIAbility } from '@kit.AbilityKit'; 20``` 21 22## 属性 23 24**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 25 26| 名称 | 类型 | 只读 | 可选 | 说明 | 27| -------- | -------- | -------- | -------- | -------- | 28| context | [UIAbilityContext](js-apis-inner-application-uiAbilityContext.md) | 否 | 否 | 上下文。<br>**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 | 29| launchWant | [Want](js-apis-app-ability-want.md) | 否 | 否 | UIAbility启动时的参数。<br>**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 | 30| lastRequestWant | [Want](js-apis-app-ability-want.md) | 否 | 否 | UIAbility最后请求时的参数。<br>**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。| 31| callee | [Callee](#callee) | 否 | 否 | 调用Stub(桩)服务对象。| 32 33## UIAbility.onCreate 34 35onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void 36 37UIAbility实例处于完全关闭状态下被创建完成后进入该生命周期回调,执行初始化业务逻辑操作。即UIAbility实例[冷启动](../../application-models/uiability-intra-device-interaction.md#目标uiability冷启动)时进入该生命周期回调。同步接口,不支持异步回调。 38 39**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 40 41**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 42 43**参数:** 44 45| 参数名 | 类型 | 必填 | 说明 | 46| -------- | -------- | -------- | -------- | 47| want | [Want](js-apis-app-ability-want.md) | 是 | 当前UIAbility的Want类型信息,包括ability名称、bundle名称等。 | 48| launchParam | [AbilityConstant.LaunchParam](js-apis-app-ability-abilityConstant.md#launchparam) | 是 | 创建 ability、上次异常退出的原因信息。 | 49 50**示例:** 51 52```ts 53import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit'; 54 55class MyUIAbility extends UIAbility { 56 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 57 console.log(`onCreate, want: ${want.abilityName}`); 58 } 59} 60``` 61 62 63## UIAbility.onWindowStageCreate 64 65onWindowStageCreate(windowStage: window.WindowStage): void 66 67当WindowStage创建后调用。 68 69**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 70 71**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 72 73**参数:** 74 75| 参数名 | 类型 | 必填 | 说明 | 76| -------- | -------- | -------- | -------- | 77| windowStage | [window.WindowStage](../apis-arkui/js-apis-window.md#windowstage9) | 是 | WindowStage相关信息。 | 78 79**示例:** 80 81```ts 82import { UIAbility } from '@kit.AbilityKit'; 83import { window } from '@kit.ArkUI'; 84 85class MyUIAbility extends UIAbility { 86 onWindowStageCreate(windowStage: window.WindowStage) { 87 console.log('onWindowStageCreate'); 88 } 89} 90``` 91 92 93## UIAbility.onWindowStageWillDestroy<sup>12+</sup> 94 95onWindowStageWillDestroy(windowStage: window.WindowStage): void 96 97当WindowStage即将销毁时调用。 98 99**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 100 101**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 102 103**参数:** 104 105| 参数名 | 类型 | 必填 | 说明 | 106| -------- | -------- | -------- | -------- | 107| windowStage | [window.WindowStage](../apis-arkui/js-apis-window.md#windowstage9) | 是 | WindowStage相关信息。 | 108 109**示例:** 110 111```ts 112import { UIAbility } from '@kit.AbilityKit'; 113import { window } from '@kit.ArkUI'; 114 115class MyUIAbility extends UIAbility { 116 onWindowStageWillDestroy(windowStage: window.WindowStage) { 117 console.log('onWindowStageWillDestroy'); 118 } 119} 120``` 121 122 123## UIAbility.onWindowStageDestroy 124 125onWindowStageDestroy(): void 126 127当WindowStage销毁后调用。 128 129**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 130 131**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 132 133**示例:** 134 135```ts 136import { UIAbility } from '@kit.AbilityKit'; 137 138class MyUIAbility extends UIAbility { 139 onWindowStageDestroy() { 140 console.log('onWindowStageDestroy'); 141 } 142} 143``` 144 145 146## UIAbility.onWindowStageRestore 147 148onWindowStageRestore(windowStage: window.WindowStage): void 149 150当迁移多实例Ability时,恢复WindowStage后调用。 151 152**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 153 154**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 155 156**参数:** 157 158| 参数名 | 类型 | 必填 | 说明 | 159| -------- | -------- | -------- | -------- | 160| windowStage | [window.WindowStage](../apis-arkui/js-apis-window.md#windowstage9) | 是 | WindowStage相关信息。 | 161 162**示例:** 163 164```ts 165import { UIAbility } from '@kit.AbilityKit'; 166import { window } from '@kit.ArkUI'; 167 168class MyUIAbility extends UIAbility { 169 onWindowStageRestore(windowStage: window.WindowStage) { 170 console.log('onWindowStageRestore'); 171 } 172} 173``` 174 175 176## UIAbility.onDestroy 177 178onDestroy(): void | Promise<void> 179 180UIAbility生命周期回调,在销毁时回调,执行资源清理等操作。使用同步回调或Promise异步回调。 181 182**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 183 184**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 185 186**返回值:** 187 188| 类型 | 说明 | 189| -------- | -------- | 190| void \| Promise<void> | 无返回结果或无返回结果的Promise对象。 | 191 192**示例:** 193 194```ts 195import { UIAbility } from '@kit.AbilityKit'; 196 197class MyUIAbility extends UIAbility { 198 onDestroy() { 199 console.log('onDestroy'); 200 } 201} 202``` 203 204在执行完onDestroy生命周期回调后,应用可能会退出,从而可能导致onDestroy中的异步函数未能正确执行,比如异步写入数据库。可以使用异步生命周期,以确保异步onDestroy完成后再继续后续的生命周期。 205 206```ts 207import { UIAbility } from '@kit.AbilityKit'; 208 209class MyUIAbility extends UIAbility { 210 async onDestroy() { 211 console.log('onDestroy'); 212 // 调用异步函数... 213 } 214} 215``` 216 217## UIAbility.onForeground 218 219onForeground(): void 220 221UIAbility生命周期回调,当应用从后台转到前台时触发。同步接口,不支持异步回调。 222 223**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 224 225**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 226 227**示例:** 228 229```ts 230import { UIAbility } from '@kit.AbilityKit'; 231 232class MyUIAbility extends UIAbility { 233 onForeground() { 234 console.log('onForeground'); 235 } 236} 237``` 238 239 240## UIAbility.onBackground 241 242onBackground(): void 243 244UIAbility生命周期回调,当应用从前台转到后台时触发。同步接口,不支持异步回调。 245 246**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 247 248**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 249 250**示例:** 251 252```ts 253import { UIAbility } from '@kit.AbilityKit'; 254 255class MyUIAbility extends UIAbility { 256 onBackground() { 257 console.log('onBackground'); 258 } 259} 260``` 261 262 263## UIAbility.onContinue 264 265onContinue(wantParam: Record<string, Object>): AbilityConstant.OnContinueResult | Promise<AbilityConstant.OnContinueResult> 266 267当Ability准备迁移时触发,保存数据。 268 269> **说明:** 270> 271> 从API version 12 开始,UIAbility.onContinue生命周期新增支持返回值为Promise\<[AbilityConstant.OnContinueResult](js-apis-app-ability-abilityConstant.md#oncontinueresult)\>形式。 272 273**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 274 275**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 276 277**参数:** 278 279| 参数名 | 类型 | 必填 | 说明 | 280| -------- | -------- | -------- | -------- | 281| wantParam | Record<string, Object> | 是 | want相关参数。 | 282 283**返回值:** 284 285| 类型 | 说明 | 286| -------- | -------- | 287| [AbilityConstant.OnContinueResult](js-apis-app-ability-abilityConstant.md#oncontinueresult) \| Promise<[AbilityConstant.OnContinueResult](js-apis-app-ability-abilityConstant.md#oncontinueresult)> | 接续的结果或带接续结果的Promise对象。 | 288 289**示例:** 290 291 ```ts 292 import { UIAbility, AbilityConstant } from '@kit.AbilityKit'; 293 294 class MyUIAbility extends UIAbility { 295 onContinue(wantParams: Record<string, Object>) { 296 console.log('onContinue'); 297 wantParams['myData'] = 'my1234567'; 298 return AbilityConstant.OnContinueResult.AGREE; 299 } 300 } 301 ``` 302 303支持应用在迁移时,使用异步接口进行数据保存。 304 305 ```ts 306 import { UIAbility, AbilityConstant } from '@kit.AbilityKit'; 307 308 class MyUIAbility extends UIAbility { 309 async setWant(wantParams: Record<string, Object>) { 310 console.log('setWant start'); 311 for (let time = 0; time < 1000; ++time) { 312 wantParams[time] = time; 313 } 314 console.log('setWant end'); 315 } 316 317 async onContinue(wantParams: Record<string, Object>) { 318 console.log('onContinue'); 319 return this.setWant(wantParams).then(()=>{ 320 return AbilityConstant.OnContinueResult.AGREE; 321 }); 322 } 323 } 324 ``` 325 326 327## UIAbility.onNewWant 328 329onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void 330 331UIAbility实例已经启动并在前台运行过,由于某些原因切换到后台,再次启动该UIAbility实例时会回调执行该方法。即UIAbility实例[热启动](../../application-models/uiability-intra-device-interaction.md#目标uiability热启动)时进入该生命周期回调。 332 333**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 334 335**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 336 337**参数:** 338 339| 参数名 | 类型 | 必填 | 说明 | 340| -------- | -------- | -------- | -------- | 341| want | [Want](js-apis-app-ability-want.md) | 是 | Want类型参数,如Ability名称,包名等。 | 342| launchParam | [AbilityConstant.LaunchParam](js-apis-app-ability-abilityConstant.md#launchparam) | 是 | UIAbility启动的原因、上次异常退出的原因信息。 | 343 344**示例:** 345 346```ts 347import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit'; 348 349class MyUIAbility extends UIAbility { 350 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) { 351 console.log(`onNewWant, want: ${want.abilityName}`); 352 console.log(`onNewWant, launchParam: ${JSON.stringify(launchParam)}`); 353 } 354} 355``` 356 357## UIAbility.onDump 358 359onDump(params: Array\<string>): Array\<string> 360 361转储客户端信息时调用,可用于转储非敏感信息。 362 363**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 364 365**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 366 367**参数:** 368 369| 参数名 | 类型 | 必填 | 说明 | 370| -------- | -------- | -------- | -------- | 371| params | Array\<string> | 是 | 表示命令形式的参数。| 372 373**返回值:** 374 375| 类型 | 说明 | 376| -------- | -------- | 377| Array\<string> | 转储信息数组。| 378 379**示例:** 380 381```ts 382import { UIAbility } from '@kit.AbilityKit'; 383 384class MyUIAbility extends UIAbility { 385 onDump(params: Array<string>) { 386 console.log(`dump, params: ${JSON.stringify(params)}`); 387 return ['params']; 388 } 389} 390``` 391 392 393## UIAbility.onSaveState 394 395onSaveState(reason: AbilityConstant.StateType, wantParam: Record<string, Object>): AbilityConstant.OnSaveResult 396 397该API配合[appRecovery](js-apis-app-ability-appRecovery.md)使用。当应用出现故障时,如果已启用自动保存状态,框架将调用onSaveState来保存UIAbility的状态。 398 399**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 400 401**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 402 403**参数:** 404 405| 参数名 | 类型 | 必填 | 说明 | 406| -------- | -------- | -------- | -------- | 407| reason | [AbilityConstant.StateType](js-apis-app-ability-abilityConstant.md#statetype) | 是 | 回调保存状态的原因。 | 408| wantParam | Record<string, Object> | 是 | want相关参数。 | 409 410**返回值:** 411 412| 类型 | 说明 | 413| -------- | -------- | 414| [AbilityConstant.OnSaveResult](js-apis-app-ability-abilityConstant.md#onsaveresult) | 是否同意保存当前UIAbility的状态。 | 415 416**示例:** 417 418```ts 419import { UIAbility, AbilityConstant } from '@kit.AbilityKit'; 420 421class MyUIAbility extends UIAbility { 422 onSaveState(reason: AbilityConstant.StateType, wantParam: Record<string, Object>) { 423 console.log('onSaveState'); 424 wantParam['myData'] = 'my1234567'; 425 return AbilityConstant.OnSaveResult.RECOVERY_AGREE; 426 } 427} 428``` 429 430## UIAbility.onShare<sup>10+</sup> 431 432onShare(wantParam: Record<string, Object>): void 433 434在跨端分享场景下,在UIAbility中设置分享方设备要分享的数据。 435 436**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 437 438**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 439 440**参数:** 441 442| 参数名 | 类型 | 必填 | 说明 | 443| -------- | -------- | -------- | -------- | 444| wantParam | Record<string, Object> | 是 | 待分享的数据。 | 445 446**示例:** 447 448```ts 449import { UIAbility } from '@kit.AbilityKit'; 450 451class MyUIAbility extends UIAbility { 452 onShare(wantParams: Record<string, Object>) { 453 console.log('onShare'); 454 wantParams['ohos.extra.param.key.shareUrl'] = 'example.com'; 455 } 456} 457``` 458 459## UIAbility.onPrepareToTerminate<sup>10+</sup> 460 461onPrepareToTerminate(): boolean 462 463UIAbility生命周期回调,在UIAbility关闭时触发,用于在UIAbility正式关闭前执行其他操作。例如,询问用户是否确认关闭UIAbility。如果用户确认关闭UIAbility,可配合[terminateSelf](js-apis-inner-application-uiAbilityContext.md#uiabilitycontextterminateself)接口关闭。 464 465当前仅在2in1设备上生效。 466 467> **说明:** 468> 469> - 从API version 15开始,当[UIAbility.onPrepareToTerminateAsync](#uiabilityonpreparetoterminateasync15)实现时,本回调函数将不执行。当[AbilityStage.onPrepareTerminationAsync](js-apis-app-ability-abilityStage.md#abilitystageonprepareterminationasync15)或[AbilityStage.onPrepareTermination](js-apis-app-ability-abilityStage.md#abilitystageonpreparetermination15)实现时,在dock栏或系统托盘处右键点击关闭,本回调函数将不执行。 470 471**需要权限**:ohos.permission.PREPARE_APP_TERMINATE 472 473**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 474 475**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 476 477**返回值:** 478 479| 类型 | 说明 | 480| -- | -- | 481| boolean | 是否执行UIAbility关闭操作,返回true表示本次UIAbility关闭流程取消,返回false表示UIAbility继续正常关闭。 | 482 483**示例:** 484 485```ts 486import { UIAbility, Want } from '@kit.AbilityKit'; 487import { BusinessError } from '@kit.BasicServicesKit'; 488 489export default class EntryAbility extends UIAbility { 490 onPrepareToTerminate() { 491 // 开发者定义预关闭动作 492 // 例如拉起另一个ability,根据ability处理结果执行异步关闭 493 let want: Want = { 494 bundleName: "com.example.myapplication", 495 moduleName: "entry", 496 abilityName: "SecondAbility" 497 } 498 this.context.startAbilityForResult(want) 499 .then((result)=>{ 500 // 获取ability处理结果,当返回结果的resultCode为0关闭当前UIAbility 501 console.log('startAbilityForResult success, resultCode is ' + result.resultCode); 502 if (result.resultCode === 0) { 503 this.context.terminateSelf(); 504 } 505 }).catch((err: BusinessError)=>{ 506 // 异常处理 507 console.error('startAbilityForResult failed, err:' + JSON.stringify(err)); 508 this.context.terminateSelf(); 509 }) 510 511 return true; // 已定义预关闭操作后,返回true表示UIAbility取消关闭 512 } 513} 514``` 515 516## UIAbility.onPrepareToTerminateAsync<sup>15+</sup> 517 518onPrepareToTerminateAsync(): Promise\<boolean> 519 520UIAbility生命周期异步回调,在UIAbility关闭时触发,通过使用Promise异步回调的方式,在UIAbility正式关闭前执行操作。例如,询问用户是否确认关闭UIAbility。如果用户确认关闭UIAbility,可配合[terminateSelf](js-apis-inner-application-uiAbilityContext.md#uiabilitycontextterminateself)接口关闭。 521 522当前仅在2in1设备上生效。 523 524> **说明:** 525> 526> - 当[AbilityStage.onPrepareTerminationAsync](js-apis-app-ability-abilityStage.md#abilitystageonprepareterminationasync15)或[AbilityStage.onPrepareTermination](js-apis-app-ability-abilityStage.md#abilitystageonpreparetermination15)实现时,在dock栏或系统托盘处右键点击关闭,本回调函数将不执行。 527> 528> - 若异步回调内发生crash,按超时处理,执行等待超过10秒未响应,UIAbility将被强制关闭。 529 530**需要权限**:ohos.permission.PREPARE_APP_TERMINATE 531 532**原子化服务API**:从API version 15开始,该接口支持在原子化服务中使用。 533 534**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 535 536**返回值:** 537 538| 类型 | 说明 | 539| -- | -- | 540| Promise\<boolean> | Promise对象。表示是否执行UIAbility关闭操作,返回true表示本次UIAbility关闭流程取消,返回false表示UIAbility继续正常关闭。 | 541 542**示例:** 543 544```ts 545import { UIAbility } from '@kit.AbilityKit'; 546 547export default class EntryAbility extends UIAbility { 548 async onPrepareToTerminateAsync(): Promise<boolean> { 549 await new Promise<boolean>((res, rej) => { 550 setTimeout(res, 2000); // 延时2秒 551 }); 552 return true; // 已定义预关闭操作后,返回true表示UIAbility取消关闭 553 } 554} 555``` 556 557## UIAbility.onBackPressed<sup>10+</sup> 558 559onBackPressed(): boolean 560 561UIAbility生命周期回调,当UIAbility侧滑返回时触发,根据返回值决定是否销毁UIAbility。 562 563- 当targetSdkVersion<12时,默认返回值为false,会销毁UIAbility。 564- 当targetSdkVersion>=12时,默认返回值为true,会将UIAbility移动到后台不销毁。 565 566**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 567 568**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 569 570**返回值:** 571 572| 类型 | 说明 | 573| -- | -- | 574| boolean | 返回true表示UIAbility将会被移到后台不销毁,返回false表示UIAbility将正常销毁。 | 575 576**示例:** 577 578```ts 579import { UIAbility } from '@kit.AbilityKit'; 580 581export default class EntryAbility extends UIAbility { 582 onBackPressed() { 583 return true; 584 } 585} 586``` 587 588## UIAbility.onCollaborate<sup>18+</sup> 589 590onCollaborate(wantParam: Record<string, Object>): AbilityConstant.CollaborateResult 591 592UIAbility生命周期回调,在多设备协同场景下,协同方应用在被拉起的过程中返回是否接受协同。 593 594 **说明:** 595- 该生命周期回调不支持specified启动模式。 596- 通过startAbility()等方法拉起协同方应用时,需要在Want对象中设置协同标记[Flags](js-apis-ability-wantConstant.md#flags)为FLAG_ABILITY_ON_COLLABORATE。 597- 冷启动时,该回调在[onForeground](#uiabilityonforeground)前或[onBackground](#uiabilityonbackground)后调用;热启动时,该回调在[onNewWant](#uiabilityonnewwant)前调用。 598 599 600**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 601 602**参数:** 603 604| 参数名 | 类型 | 必填 | 说明 | 605| --------- | --------------------------------- | ---- | ------------------------------------------------------------ | 606| wantParam | Record<string, Object> | 是 | want相关参数,仅支持key值取"ohos.extra.param.key.supportCollaborateIndex"。通过该key值可以可以获取到调用方传输的数据并进行相应的处理。| 607 608**返回值:** 609 610| 名称 | 值 | 说明 | 611| -------- | ---- | ---------- | 612| [AbilityConstant.CollaborateResult](js-apis-app-ability-abilityConstant.md#collaborateresult18) | 协同方应用是否接受协同。 | 613 614**示例:** 615 616```ts 617import { UIAbility, AbilityConstant } from '@kit.AbilityKit'; 618 619class MyAbility extends UIAbility { 620 onCollaborate(wantParam: Record<string, Object>) { 621 return AbilityConstant.CollaborateResult.ACCEPT; 622 } 623} 624``` 625 626## Caller 627 628通用组件Caller通信客户端调用接口, 用来向通用组件服务端发送约定数据。 629 630### Caller.call 631 632call(method: string, data: rpc.Parcelable): Promise<void> 633 634向通用组件服务端发送约定序列化数据。使用Promise异步回调。 635 636**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 637 638**参数:** 639 640| 参数名 | 类型 | 必填 | 说明 | 641| -------- | -------- | -------- | -------- | 642| method | string | 是 | 约定的服务端注册事件字符串。 | 643| data | [rpc.Parcelable](../apis-ipc-kit/js-apis-rpc.md#parcelable9) | 是 | 由开发者实现的Parcelable可序列化数据。 | 644 645**返回值:** 646 647| 类型 | 说明 | 648| -------- | -------- | 649| Promise<void> | Promise对象。无返回结果的Promise对象。 | 650 651**错误码:** 652 653以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 654 655| 错误码ID | 错误信息 | 656| ------- | -------------------------------- | 657| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. | 658| 16200001 | Caller released. The caller has been released. | 659| 16200002 | The callee does not exist. | 660| 16000050 | Internal error. | 661 662**示例:** 663 664```ts 665import { UIAbility, Caller } from '@kit.AbilityKit'; 666import { window } from '@kit.ArkUI'; 667import { rpc } from '@kit.IPCKit'; 668import { BusinessError } from '@kit.BasicServicesKit'; 669 670class MyMessageAble implements rpc.Parcelable { // 自定义的Parcelable数据结构 671 name: string 672 str: string 673 num: number = 1 674 constructor(name: string, str: string) { 675 this.name = name; 676 this.str = str; 677 } 678 marshalling(messageSequence: rpc.MessageSequence) { 679 messageSequence.writeInt(this.num); 680 messageSequence.writeString(this.str); 681 console.log(`MyMessageAble marshalling num[${this.num}] str[${this.str}]`); 682 return true; 683 } 684 unmarshalling(messageSequence: rpc.MessageSequence) { 685 this.num = messageSequence.readInt(); 686 this.str = messageSequence.readString(); 687 console.log(`MyMessageAble unmarshalling num[${this.num}] str[${this.str}]`); 688 return true; 689 } 690}; 691let method = 'call_Function'; // 约定的通知消息字符串 692let caller: Caller; 693 694export default class MainUIAbility extends UIAbility { 695 onWindowStageCreate(windowStage: window.WindowStage) { 696 this.context.startAbilityByCall({ 697 bundleName: 'com.example.myservice', 698 abilityName: 'MainUIAbility', 699 deviceId: '' 700 }).then((obj) => { 701 caller = obj; 702 let msg = new MyMessageAble('msg', 'world'); // 参考Parcelable数据定义 703 caller.call(method, msg) 704 .then(() => { 705 console.log('Caller call() called'); 706 }) 707 .catch((callErr: BusinessError) => { 708 console.error(`Caller.call catch error, error.code: ${callErr.code}, error.message: ${callErr.message}`); 709 }); 710 }).catch((err: BusinessError) => { 711 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 712 }); 713 } 714} 715``` 716 717 718### Caller.callWithResult 719 720callWithResult(method: string, data: rpc.Parcelable): Promise<rpc.MessageSequence> 721 722向通用组件服务端发送约定序列化数据, 并将服务端返回的约定序列化数据带回。使用Promise异步回调。 723 724**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 725 726**参数:** 727 728| 参数名 | 类型 | 必填 | 说明 | 729| -------- | -------- | -------- | -------- | 730| method | string | 是 | 约定的服务端注册事件字符串。 | 731| data | [rpc.Parcelable](../apis-ipc-kit/js-apis-rpc.md#parcelable9) | 是 | 由开发者实现的Parcelable可序列化数据。 | 732 733**返回值:** 734 735| 类型 | 说明 | 736| -------- | -------- | 737| Promise<[rpc.MessageSequence](../apis-ipc-kit/js-apis-rpc.md#messagesequence9)> | Promise对象,返回通用组件服务端应答数据。 | 738 739**错误码:** 740 741以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 742 743| 错误码ID | 错误信息 | 744| ------- | -------------------------------- | 745| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. | 746| 16200001 | Caller released. The caller has been released. | 747| 16200002 | The callee does not exist. | 748| 16000050 | Internal error. | 749 750**示例:** 751 752```ts 753import { UIAbility, Caller } from '@kit.AbilityKit'; 754import { window } from '@kit.ArkUI'; 755import { rpc } from '@kit.IPCKit'; 756import { BusinessError } from '@kit.BasicServicesKit'; 757 758class MyMessageAble implements rpc.Parcelable { 759 name: string 760 str: string 761 num: number = 1 762 constructor(name: string, str: string) { 763 this.name = name; 764 this.str = str; 765 } 766 marshalling(messageSequence: rpc.MessageSequence) { 767 messageSequence.writeInt(this.num); 768 messageSequence.writeString(this.str); 769 console.log(`MyMessageAble marshalling num[${this.num}] str[${this.str}]`); 770 return true; 771 } 772 unmarshalling(messageSequence: rpc.MessageSequence) { 773 this.num = messageSequence.readInt(); 774 this.str = messageSequence.readString(); 775 console.log(`MyMessageAble unmarshalling num[${this.num}] str[${this.str}]`); 776 return true; 777 } 778}; 779let method = 'call_Function'; 780let caller: Caller; 781 782export default class MainUIAbility extends UIAbility { 783 onWindowStageCreate(windowStage: window.WindowStage) { 784 this.context.startAbilityByCall({ 785 bundleName: 'com.example.myservice', 786 abilityName: 'MainUIAbility', 787 deviceId: '' 788 }).then((obj) => { 789 caller = obj; 790 let msg = new MyMessageAble('msg', 'world'); 791 caller.callWithResult(method, msg) 792 .then((data) => { 793 console.log('Caller callWithResult() called'); 794 let retmsg = new MyMessageAble('msg', 'world'); 795 data.readParcelable(retmsg); 796 }) 797 .catch((callErr: BusinessError) => { 798 console.error(`Caller.callWithResult catch error, error.code: ${callErr.code}, error.message: ${callErr.message}`); 799 }); 800 }).catch((err: BusinessError) => { 801 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 802 }); 803 } 804} 805``` 806 807 808### Caller.release 809 810release(): void 811 812主动释放通用组件服务端的通信接口。 813 814**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 815 816**错误码:** 817 818以下错误码详细介绍请参考[元能力子系统错误码](errorcode-ability.md)。 819 820| 错误码ID | 错误信息 | 821| ------- | -------------------------------- | 822| 16200001 | Caller released. The caller has been released. | 823| 16200002 | The callee does not exist. | 824 825**示例:** 826 827```ts 828import { UIAbility, Caller } from '@kit.AbilityKit'; 829import { window } from '@kit.ArkUI'; 830import { BusinessError } from '@kit.BasicServicesKit'; 831 832let caller: Caller; 833 834export default class MainUIAbility extends UIAbility { 835 onWindowStageCreate(windowStage: window.WindowStage) { 836 this.context.startAbilityByCall({ 837 bundleName: 'com.example.myservice', 838 abilityName: 'MainUIAbility', 839 deviceId: '' 840 }).then((obj) => { 841 caller = obj; 842 try { 843 caller.release(); 844 } catch (releaseErr) { 845 console.error(`Caller.release catch error, error.code: ${releaseErr.code}, error.message: ${releaseErr.message}`); 846 } 847 }).catch((err: BusinessError) => { 848 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 849 }); 850 } 851} 852``` 853 854### Caller.onRelease 855 856 onRelease(callback: OnReleaseCallback): void 857 858注册通用组件服务端Stub(桩)断开监听通知。使用callback异步回调。 859 860**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 861 862**参数:** 863 864| 参数名 | 类型 | 必填 | 说明 | 865| -------- | -------- | -------- | -------- | 866| callback | [OnReleaseCallback](#onreleasecallback) | 是 | 回调函数,返回onRelease回调结果。 | 867 868**错误码:** 869 870以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 871 872| 错误码ID | 错误信息 | 873| ------- | -------------------------------- | 874| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. | 875| 16200001 | Caller released. The caller has been released. | 876 877**示例:** 878 879```ts 880import { UIAbility, Caller } from '@kit.AbilityKit'; 881import { window } from '@kit.ArkUI'; 882import { BusinessError } from '@kit.BasicServicesKit'; 883 884let caller: Caller; 885 886export default class MainUIAbility extends UIAbility { 887 onWindowStageCreate(windowStage: window.WindowStage) { 888 this.context.startAbilityByCall({ 889 bundleName: 'com.example.myservice', 890 abilityName: 'MainUIAbility', 891 deviceId: '' 892 }).then((obj) => { 893 caller = obj; 894 try { 895 caller.onRelease((str) => { 896 console.log(`Caller OnRelease CallBack is called ${str}`); 897 }); 898 } catch (error) { 899 console.error(`Caller.onRelease catch error, error.code: $error.code}, error.message: ${error.message}`); 900 } 901 }).catch((err: BusinessError) => { 902 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 903 }); 904 } 905} 906``` 907 908### Caller.onRemoteStateChange<sup>10+</sup> 909 910onRemoteStateChange(callback: OnRemoteStateChangeCallback): void 911 912注册协同场景下跨设备组件状态变化监听通知。使用callback异步回调。 913 914**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 915 916**参数:** 917 918| 参数名 | 类型 | 必填 | 说明 | 919| -------- | -------- | -------- | -------- | 920| callback | [OnRemoteStateChangeCallback](#onremotestatechangecallback10) | 是 | 回调函数,返回onRemoteStateChange回调结果。 | 921 922**错误码:** 923 924以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 925 926| 错误码ID | 错误信息 | 927| ------- | -------------------------------- | 928| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. | 929| 16200001 | Caller released. The caller has been released. | 930 931**示例:** 932 933```ts 934import { UIAbility, Caller } from '@kit.AbilityKit'; 935import { window } from '@kit.ArkUI'; 936import { BusinessError } from '@kit.BasicServicesKit'; 937 938let caller: Caller; 939let dstDeviceId: string; 940 941export default class MainAbility extends UIAbility { 942 onWindowStageCreate(windowStage: window.WindowStage) { 943 this.context.startAbilityByCall({ 944 bundleName: 'com.example.myservice', 945 abilityName: 'MainUIAbility', 946 deviceId: dstDeviceId 947 }).then((obj) => { 948 caller = obj; 949 try { 950 caller.onRemoteStateChange((str) => { 951 console.log('Remote state changed ' + str); 952 }); 953 } catch (error) { 954 console.error(`Caller.onRemoteStateChange catch error, error.code: ${JSON.stringify(error.code)}, error.message: ${JSON.stringify(error.message)}`); 955 } 956 }).catch((err: BusinessError) => { 957 console.error(`Caller GetCaller error, error.code: ${JSON.stringify(err.code)}, error.message: ${JSON.stringify(err.message)}`); 958 }) 959 } 960} 961``` 962 963### Caller.on('release') 964 965on(type: 'release', callback: OnReleaseCallback): void 966 967注册通用组件服务端Stub(桩)断开监听通知。使用callback异步回调。 968 969**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 970 971**参数:** 972 973| 参数名 | 类型 | 必填 | 说明 | 974| -------- | -------- | -------- | -------- | 975| type | string | 是 | 监听releaseCall事件,固定为'release'。 | 976| callback | [OnReleaseCallback](#onreleasecallback) | 是 | 回调函数,返回on回调结果。 | 977 978**错误码:** 979 980以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 981 982| 错误码ID | 错误信息 | 983| ------- | -------------------------------- | 984| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 985| 16200001 | Caller released. The caller has been released. | 986 987**示例:** 988 989```ts 990import { UIAbility, Caller } from '@kit.AbilityKit'; 991import { window } from '@kit.ArkUI'; 992import { BusinessError } from '@kit.BasicServicesKit'; 993 994let caller: Caller; 995 996export default class MainUIAbility extends UIAbility { 997 onWindowStageCreate(windowStage: window.WindowStage) { 998 this.context.startAbilityByCall({ 999 bundleName: 'com.example.myservice', 1000 abilityName: 'MainUIAbility', 1001 deviceId: '' 1002 }).then((obj) => { 1003 caller = obj; 1004 try { 1005 caller.on('release', (str) => { 1006 console.log(`Caller OnRelease CallBack is called ${str}`); 1007 }); 1008 } catch (error) { 1009 console.error(`Caller.on catch error, error.code: ${error.code}, error.message: ${error.message}`); 1010 } 1011 }).catch((err: BusinessError) => { 1012 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 1013 }); 1014 } 1015} 1016``` 1017 1018### Caller.off('release') 1019 1020off(type: 'release', callback: OnReleaseCallback): void 1021 1022取消注册通用组件服务端Stub(桩)断开监听通知。预留能力,当前暂未支持。使用callback异步回调。 1023 1024**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1025 1026**参数:** 1027 1028| 参数名 | 类型 | 必填 | 说明 | 1029| -------- | -------- | -------- | -------- | 1030| type | string | 是 | 监听releaseCall事件,固定为'release'。 | 1031| callback | [OnReleaseCallback](#onreleasecallback) | 是 | 回调函数,返回off回调结果。 | 1032 1033**错误码:** 1034 1035以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)。 1036 1037| 错误码ID | 错误信息 | 1038| ------- | -------------------------------- | 1039| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1040 1041**示例:** 1042 1043```ts 1044import { UIAbility, Caller, OnReleaseCallback } from '@kit.AbilityKit'; 1045import { window } from '@kit.ArkUI'; 1046import { BusinessError } from '@kit.BasicServicesKit'; 1047 1048let caller: Caller; 1049 1050export default class MainUIAbility extends UIAbility { 1051 onWindowStageCreate(windowStage: window.WindowStage) { 1052 this.context.startAbilityByCall({ 1053 bundleName: 'com.example.myservice', 1054 abilityName: 'MainUIAbility', 1055 deviceId: '' 1056 }).then((obj) => { 1057 caller = obj; 1058 try { 1059 let onReleaseCallBack: OnReleaseCallback = (str) => { 1060 console.log(`Caller OnRelease CallBack is called ${str}`); 1061 }; 1062 caller.on('release', onReleaseCallBack); 1063 caller.off('release', onReleaseCallBack); 1064 } catch (error) { 1065 console.error(`Caller.on or Caller.off catch error, error.code: ${error.code}, error.message: ${error.message}`); 1066 } 1067 }).catch((err: BusinessError) => { 1068 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 1069 }); 1070 } 1071} 1072``` 1073 1074### Caller.off('release') 1075 1076off(type: 'release'): void 1077 1078取消注册通用组件服务端Stub(桩)断开监听通知。预留能力,当前暂未支持。 1079 1080**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1081 1082**参数:** 1083 1084| 参数名 | 类型 | 必填 | 说明 | 1085| -------- | -------- | -------- | -------- | 1086| type | string | 是 | 监听releaseCall事件,固定为'release'。 | 1087 1088**错误码:** 1089 1090以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)。 1091 1092| 错误码ID | 错误信息 | 1093| ------- | -------------------------------- | 1094| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1095 1096**示例:** 1097 1098```ts 1099import { UIAbility, Caller, OnReleaseCallback } from '@kit.AbilityKit'; 1100import { window } from '@kit.ArkUI'; 1101import { BusinessError } from '@kit.BasicServicesKit'; 1102 1103let caller: Caller; 1104 1105export default class MainUIAbility extends UIAbility { 1106 onWindowStageCreate(windowStage: window.WindowStage) { 1107 this.context.startAbilityByCall({ 1108 bundleName: 'com.example.myservice', 1109 abilityName: 'MainUIAbility', 1110 deviceId: '' 1111 }).then((obj) => { 1112 caller = obj; 1113 try { 1114 let onReleaseCallBack: OnReleaseCallback = (str) => { 1115 console.log(`Caller OnRelease CallBack is called ${str}`); 1116 }; 1117 caller.on('release', onReleaseCallBack); 1118 caller.off('release'); 1119 } catch (error) { 1120 console.error(`Caller.on or Caller.off catch error, error.code: ${error.code}, error.message: ${error.message}`); 1121 } 1122 }).catch((err: BusinessError) => { 1123 console.error(`Caller GetCaller error, error.code: ${err.code}, error.message: ${err.message}`); 1124 }); 1125 } 1126} 1127``` 1128 1129## Callee 1130 1131通用组件服务端注册和解除客户端caller通知送信的callback接口。 1132 1133### Callee.on 1134 1135on(method: string, callback: CalleeCallback): void 1136 1137通用组件服务端注册消息通知callback。 1138 1139**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1140 1141**参数:** 1142 1143| 参数名 | 类型 | 必填 | 说明 | 1144| -------- | -------- | -------- | -------- | 1145| method | string | 是 | 与客户端约定的通知消息字符串。 | 1146| callback | [CalleeCallback](#calleecallback) | 是 | 一个[rpc.MessageSequence](../apis-ipc-kit/js-apis-rpc.md#messagesequence9)类型入参的js通知同步回调函数, 回调函数至少要返回一个空的[rpc.Parcelable](../apis-ipc-kit/js-apis-rpc.md#parcelable9)数据对象, 其他视为函数执行错误。 | 1147 1148**错误码:** 1149 1150以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 1151 1152| 错误码ID | 错误信息 | 1153| ------- | -------------------------------- | 1154| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1155| 16200004 | The method has been registered. | 1156| 16000050 | Internal error. | 1157 1158**示例:** 1159 1160```ts 1161import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit'; 1162import { rpc } from '@kit.IPCKit'; 1163 1164class MyMessageAble implements rpc.Parcelable { 1165 name: string 1166 str: string 1167 num: number = 1 1168 constructor(name: string, str: string) { 1169 this.name = name; 1170 this.str = str; 1171 } 1172 marshalling(messageSequence: rpc.MessageSequence) { 1173 messageSequence.writeInt(this.num); 1174 messageSequence.writeString(this.str); 1175 console.log(`MyMessageAble marshalling num[${this.num}] str[${this.str}]`); 1176 return true; 1177 } 1178 unmarshalling(messageSequence: rpc.MessageSequence) { 1179 this.num = messageSequence.readInt(); 1180 this.str = messageSequence.readString(); 1181 console.log(`MyMessageAble unmarshalling num[${this.num}] str[${this.str}]`); 1182 return true; 1183 } 1184}; 1185let method = 'call_Function'; 1186 1187function funcCallBack(pdata: rpc.MessageSequence) { 1188 console.log(`Callee funcCallBack is called ${pdata}`); 1189 let msg = new MyMessageAble('test', ''); 1190 pdata.readParcelable(msg); 1191 return new MyMessageAble('test1', 'Callee test'); 1192} 1193export default class MainUIAbility extends UIAbility { 1194 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 1195 console.log('Callee onCreate is called'); 1196 try { 1197 this.callee.on(method, funcCallBack); 1198 } catch (error) { 1199 console.error(`Callee.on catch error, error.code: ${error.code}, error.message: ${error.message}`); 1200 } 1201 } 1202} 1203``` 1204 1205### Callee.off 1206 1207off(method: string): void 1208 1209解除通用组件服务端注册消息通知callback。 1210 1211**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1212 1213**参数:** 1214 1215| 参数名 | 类型 | 必填 | 说明 | 1216| -------- | -------- | -------- | -------- | 1217| method | string | 是 | 已注册的通知事件字符串。 | 1218 1219**错误码:** 1220 1221以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 1222 1223| 错误码ID | 错误信息 | 1224| ------- | -------------------------------- | 1225| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1226| 16200005 | The method has not been registered. | 1227| 16000050 | Internal error. | 1228 1229**示例:** 1230 1231```ts 1232import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit'; 1233 1234let method = 'call_Function'; 1235 1236export default class MainUIAbility extends UIAbility { 1237 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { 1238 console.log('Callee onCreate is called'); 1239 try { 1240 this.callee.off(method); 1241 } catch (error) { 1242 console.error(`Callee.off catch error, error.code: ${error.code}, error.message: ${error.message}`); 1243 } 1244 } 1245} 1246``` 1247 1248## OnReleaseCallback 1249 1250### (msg: string) 1251 1252(msg: string): void 1253 1254注册通用组件服务端Stub(桩)断开监听通知的回调函数类型。 1255 1256**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1257 1258**参数:** 1259 1260| 参数名 | 类型 | 必填 | 说明 | 1261| --- | ----- | --- | -------- | 1262| msg | string | 是 | 用于传递释放消息。 | 1263 1264## OnRemoteStateChangeCallback<sup>10+</sup> 1265 1266### (msg: string) 1267 1268(msg: string): void 1269 1270注册协同场景下跨设备组件状态变化监听通知的回调函数类型。 1271 1272**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1273 1274**参数:** 1275 1276| 参数名 | 类型 | 必填 | 说明 | 1277| --- | ----- | --- | -------- | 1278| msg | string | 是 | 用于传递释放消息。 | 1279 1280## CalleeCallback 1281 1282### (indata: rpc.MessageSequence) 1283 1284(indata: rpc.MessageSequence): rpc.Parcelable 1285 1286通用组件服务端注册消息通知的回调函数类型。 1287 1288**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 1289 1290**参数:** 1291 1292| 参数名 | 类型 | 必填 | 说明 | 1293| --- | ----- | --- | -------- | 1294| indata | [rpc.MessageSequence](../apis-ipc-kit/js-apis-rpc.md#messagesequence9) | 是 | 发送需传递的数据。 | 1295 1296**返回值:** 1297 1298| 类型 | 说明 | 1299| ------------ | ------------------------------------- | 1300| [rpc.Parcelable](../apis-ipc-kit/js-apis-rpc.md#parcelable9) | 返回的数据对象。 | 1301