UIAbility组件基础
什么是UIAbility
UIAbility是一种包含用户界面的应用组件,主要用户与用户进行交互,是应用程序的入口。
UIAbility作为系统调度的单元,提供窗口用于界面绘制
进入应用程序的方式有两种:
- 方式一:点击桌面图标进入应用,点击图标后用户看的应用界面就是基于UIAbility实现的一个应用实例
- 方式二:最近任务列表切回应用,在任务列表中的应用任务也都是基于UIAbility 实现的一个应用实例
UIAbility组件
UIAbility组件概述
概述
UIAbility是一种包含UI的应用组件,主要用于和用户交互
UIAbility的设计理念:
- 原生支持应用组件级的跨端迁移和多端协同。
- 支持多设备和多窗口形态。
UIAbility划分原则与建议:
UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。例如,在支付应用中,可以将入口功能和收付款功能分别配置为独立的UIAbility组件。例如,在支付应用中,可以将入口功能和收款功能分别配置为独立的UIAbility。
每个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。
对于开发者而言,可以根据具体场景选择单个还是多个UIAbility,划分建议如下:
- 如果开发者希望在任务视图中看到一个任务,则建议使用一个UIAbility,多个页面的方式。
- 如果开发者希望在任务视图中看到多个任务,或者需要同时开启多个窗口,则建议使用多个UIAbility开发不同的模块功能。
声明配置
为使应用能够正常使用UIAbility,需要在module.json5配置文件的abilities标签中声明UIAbility的名称、入口、标签等相关信息。
{
"module": {
...
"abilities": [
{
"name": "EntryAbility", // UIAbility组件的名称
"srcEntry": "./ets/entryability/EntryAbility.ets", // UIAbility组件的代码路径
"description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
"icon": "$media:icon", // UIAbility组件的图标
"label": "$string:EntryAbility_label", // UIAbility组件的标签
"startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
"startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
...
}
]
}
}
UIAbility组件生命周期
概述
当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期不同状态之间转换。
UIAbility
类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbi实例的创建和销毁,或者UIAbility
实例发生了前后台的状态转换。
UIAbility
的生命周期包括Create、Foreground、Background、Destroy
四个状态。
:::success
**注意:**虽然UIAbility
触发onCreate
后下一步会触发onWindowStateCreate
态并且在onDestory
前会触发onWindowStageDestory
,但是WindowStageCreate和WindowStageDestory状态并不在UIAbility
的生命周期中,不要混淆
:::
生命周期状态说明
Create
状态
Create
状态为在应用加载过程中,UIAbility
实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI展示。
WindowStageCreate
和WindowStageDestory
状态
UIAbility
实例创建完成后,在进入Foreground
之前,系统会创建一个WindowStage
。WindowStage
创建完成后会进入onWindowStageCreate()
回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅。
在onWindowStageCreate()
回调中,通过loadContent()
方法设置应用要加载的页面,并根据需要调用on('windowStageEvent')
方法订阅WindowStage
的事件(获焦/失焦、可见\不可见)。
对应于onWindowStageCreate()
回调。在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()
回调,可以在该回调中释放UI资源。
对应onWindowStageWillDestroy()
回调,在WindowStage
销毁前执行,此时WindowStage
可以使用。
Foreground
和Background
状态
Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()
回调和onBackground()
回调。
onForeground()
回调,在UIAbility和UI可见之前,如UIAbility切换至前台时触发。可以在onForground()
回调中申请系统需要的资源,或者重新申请在onBackground()
中释放的资源。
onBackground()
回调,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时触发。可以在onBackground()
回调中是否UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI显示之前,可以在onForeground()
回调中开启定位功能,从而获取当前的位置信息。
当应用切换回后台状态,可以在onBackground()
回调中停止定位功能,以节省系统的资源消耗。
当应用的UIAbility实例已创建,且UIAbility配置为singleton启动模式时,再次调用startAbility()
方法启动该UIAbility实例时,只会进入该UIAbility
的onNewWant()
回调,不会进入其onCreate()
和onWindowStageCreate()
生命周期回调。应用可以在该回调中更新要加载的资源和数据等,用于后续的UI展示。
Destory状态
Destroy状态在UIAbility
实例销毁时触发。可以在onDestory()
回调中进行系统资源的释放、数据的保存等操作。
例如调用terminateSelf()
方法停止当前UIAbility实例,从而完成UIAbility实例的销毁;或者用户使用最近任务列表关闭该UIAbility实例,完成UIAbility的销毁。
UIAbility组件启动模式
UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:
singleton
(单实例模式)multiton
(多实例模式)specified
(指定实例模式)
singleton
启动模式
每次调用startAbility()
方法时,如果应用进程中该类型的UIAbility
实例已经存在,则复用系统中的UIAbility
实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。
如果需要使用singletion启动模式,在module.json5配置文件中的launchType
字段配置为singleton即可。
multiton
启动模式
multiton启动模式为多实例模式,每次调用startAbility()
方法时,都会在应用进程中创建一个新的该类型UIAbility实例。这种情况下可以将UIAbility配置为multiton(多实例模式)。
如果需要使用multiton启动模式,在module.json5配置文件中的launchType
字段配置为multiton即可。
specified
启动模式
specified启动模式为指定实例模式,针对一些场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
例如有两个UIAbility:EntryAbility
和SpecifiedAbility
,SpecifiedAbility
配置为指定实例模式启动,需要从EntryAbility
的页面中启动SpecifiedAbility
。
- 在
SpecifiedAbility
中,将module.json5配置文件的launchType字段配置为specified。 - 在创建UIAbility实例之前,开发者可以为该实例指定一个唯一的字符串Key,这样在调用
startAbility()
方法时,应用就可以根据指定的Key来识别响应请求的UIAbility实例。在EntryAbility中,调用startAbility()
方法时,可以在want参数中增加一个自定义参数,例如instanceKey
,以此来区分不同的UIAbility实例。 - 由于SpecifiedAbility的启动模式被配置为指定实例启动模式,因此在SpecifiedAbility启动之前,会先进入对应的
AbilityStage
的onAcceptWant()
生命周期回调中,以获取该UIAbility实例的Key值。然后系统会自动匹配,如果存在与该UIAbility实例匹配的Key,则会启动与之绑定的UIAbility实例,并进入该UIAbility实例的onNewWant()
回调函数;否则会创建一个新的UIAbility实例,并进入该UIAbility实例的onCreate()
回调函数和onWindowStageCreate()
回调函数。
在文档应用中,可以为不同的文档实例内容绑定不同的Key值。每次新建文档时,可以传入一个新的Key值(例如可以将文件的路径作为一个Key标识),此时AbilityStage
中启动UIAbility
时都会创建一个新的UIAbility
实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时AbilityStage
中再次启动该UIAbility
时,打开的仍然是之前原来已保存的文档界面。
以如下步骤所示进行举例说明。
- 打开文件A,对应启动一个新的
UIAbility实例
,例如启动UIAbility实例1
。 - 在最近任务列表中关闭文件A的任务进程,此时
UIAbility实例1
被销毁,回到桌面,再次打开文件A,此时对应启动一个新的UIAbility
实例,例如启动UIAbility实例2
。 - 回到桌面,打开文件B,此时对应启动一个新的
UIAbility
实例,例如启动UIAbility实例3
。 - 回到桌面,再次打开文件A,此时仍然启动之前的
UIAbility实例2
,因为系统会自动匹配UIAbility
实例的Key值,如果存在与之匹配的Key,则会启动与之绑定的UIAbility
实例。在此例中,之前启动的UIAbility实例2
与文件A绑定的Key是相同的,因此系统会拉回UIAbility实例2
并让其获焦,而不会创建新的实例。
UIAbility
组件基本用法
UIAbility
组件的基本用法包括:指定UIAbility的启动页面以及获取UIAbility的上下文UIAbilityContext
。
指定UIAbility
的启动页面
应用中的UIAbility在启动过程中,需要指定启动页面,否则应用启动后会因为没有默认加载页面而导致白屏。可以在UIAbility的onWindowStageCreate()
生命周期回调中,通过WindowStage
对象的loadContent()
方法设置启动页面。
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}
// ...
}
获取UIAbility
的上下文信息
UIAbility
类拥有自身的上下文信息,该信息为UIAbilityContext
类的实例,UIAbilityContext
类拥有abilityInfo、currentHapModuleInfo
等属性。通过UIAbilityContext
可以获取UIAbility的相关配置信息,如包代码路径、Bundle名称、Ability名称和应用程序需要的环境状态等属性信息,以及可以获取操作UIAbility实例的方法(如startAbility()、connectServiceExtensionAbility()、terminateSelf()
等)。
如果需要在页面中获得当前Ability的Context,可调用getContext接口获取当前页面关联的UIAbilityContext
或ExtensionContext
。
- 在UIAbility中可以通过
this.context
获取UIAbility
实例的上下文信息。
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 获取UIAbility实例的上下文
let context = this.context;
// ...
}
}
- 在页面中获取UIAbility实例的上下文信息,包括导入依赖资源context模块和在组件中定义一个context变量两个部分。
import { common, Want } from '@kit.AbilityKit';
@Entry
@Component
struct Page_EventHub {
private context = getContext(this) as common.UIAbilityContext;
startAbilityTest(): void {
let want: Want = {
// Want参数信息
};
this.context.startAbility(want);
}
// 页面展示
build() {
// ...
}
}
也可以在导入依赖资源context模块后,在具体使用UIAbilityContext
前进行变量定义。
import { common, Want } from '@kit.AbilityKit';
@Entry
@Component
struct Page_UIAbilityComponentsBasicUsage {
startAbilityTest(): void {
let context = getContext(this) as common.UIAbilityContext;
let want: Want = {
// Want参数信息
};
context.startAbility(want);
}
// 页面展示
build() {
// ...
}
}
UIAbility组件与UI的数据同步
基于当前的应用模型,可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。
- 使用EventHub进行数据通信:在基类Context中提供各类EventHub对象,可以通过发布订阅方式来实现事件的传递。在事件传递前,订阅者需要先进行订阅,当发布者发布事件时,订阅者将接收到事件并进行相应处理。
- 使用AppStorage/LocalStorage进行数据同步:ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。
使用EventHub进行数据通信
EventHub为UIAbility组件提供了事件机制,使它们能够进行订阅、取消订阅和触发事件等数据通信能力。
在基类Context中,提供了EventHub对象,可用于在UIAbility组件实例内通信。使用EventHub实现UIAbility与UI之间的数据通信需要先从上下文(context)中获取EventHub对象。
- 在UIAbility中调用
eventHub.on()
取注册一个自定义事件event1,eventHub.on()
有两种调用方式,使用其中一种- 第一种是定义函数后引用函数
- 第二种是直接使用箭头函数定义事件函数体
import { hilog } from '@kit.PerformanceAnalysisKit';
import { UIAbility, Context, Want, AbilityConstant } from '@kit.AbilityKit';
const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EventAbility]';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 获取eventHub
let eventhub = this.context.eventHub;
// 执行订阅操作
// 第一种方式
eventhub.on('event1', this.eventFunc);
// 第二种方式
eventhub.on('event1', (data: string) => {
// 触发事件,完成相应的业务操作
});
hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onCreate');
}
// ...
eventFunc(argOne: Context, argTwo: Context): void {
hilog.info(DOMAIN_NUMBER, TAG, '1. ' + `${argOne}, ${argTwo}`);
return;
}
}
- 在UI中通过
eventHub.emit()
方法触发该事件,在触发事件的同时,根据需要传入参数信息,开发者可以根据实际的业务场景设计事件传递的参数。
// 不带参数触发自定义"event1"事件
this.context.eventHub.emit('event1')
// 带一个参数触发自定义"event1"事件
this.context.eventHub.emit('event1',1)
// 带两个参数触发自定义"event1"事件
this.context.eventHub.emit('event1',2,'test')
- 在UIAbility的注册事件回调中可以得到对应的触发事件结果。
- 在自定义事件"event1"使用完成后,可以根据需要调用
eventHub.off()
方法取消该事件的订阅。
import {UIAbility} from '@kit.AbilityKit'
export default class EntryAbility extends UIAbility {
onDestory: void {
this.context.eventHub.off('event1')
}
}
使用AppStorage/LocalStorage进行数据同步
ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。使用这些方案可以方便地管理应用状态,提高应用性能和用户体验。其中,AppStorage是一个全局的状态管理器,适用于多个UIAbility共享同一状态数据的情况;而LocalStorage则是一个局部的状态管理器,适用于单个UIAbility内部使用的状态数据。通过这两种方案,开发者可以更加灵活地控制应用状态,提高应用的可维护性和可扩展性。详细请参见应用级变量的状态管理。
UIAbility组件内交互(设备内)
UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转,会涉及到启动特定的UIAbility,包括应用内的其他UIAbility、或者其他应用的UIAbility(例如第三方支付UIAbility)。
启动应用内的UIAbility组件的方式有三种:
- 启动应用内的UIAbility
- 启动应用内的UIAbility并返回结果
- 启动UIAbility的指定页面
启动应用内的UIAbility
当一个应用内包含多个UIAbility时,存在应用内启动UIAbility的场景。例如在支付应用中从入口UIAbility启动收付款UIAbility。
假设应用中有两个UIAbility:EntryAbility和FuncAbility(可以在同一个Module中,也可以在不同的Module中),需要从EntryAbility的页面中启动FuncAbility。
- 在EntryAbility中,通过调用
startAbility()
方法启动UIAbility,want为UIAbility实例启动的入口参数,启动bundleName为带启动应用的Bundle名称,abilityName为待启动的Ability名称,moduleName在待启动的UIAbility属于不同的Module时添加,parameters为自定义信息参数。 - 在FuncAbility的
onCreate()
或者onNewWant()
生命周期回调文件中接受EntryAbility
传递过来的参数。 - 在FuncAbility业务完成之后,如需要停止当前UIAbility实例,在FuncAbility中通过调用
terminateSelf()
方法实现。 - 如需要关闭应用所有的UIAbility实例,可以调用
ApplicationContext
的killAllProcess()
方法实现关闭应用所有的进程。
启动应用内的UIAbility并获取返回结果
在一个EntryAbility启动另外一个FuncAbility时,希望在被启动的FuncAbility完成相关业务后,能将结果返回给调用方。例如在应用中将入口功能和帐号登录功能分别设计为两个独立的UIAbility,在帐号登录UIAbility中完成登录操作后,需要将登录的结果返回给入口UIAbility。
仍然使用上面提到的EntryAbility与FuncAbiltiy,具体流程如下
- 在EntryAbility中,调用
startAbilityForResult()
接口启动FuncAbility,异步回到中的data用于接收FuncAbility停止自身后返回给EntryAbility的信息。
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext
const RESULT_CODE: number = 1001;
let want: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.samples.stagemodelabilitydevelop',
moduleName: 'entry', // moduleName非必选
abilityName: 'FuncAbilityA',
parameters: {
// 自定义信息
info: '来自EntryAbility UIAbilityComponentsInteractive页面'
}
};
context.startAbilityForResult(want).then((data) => {
if (data?.resultCode === RESULT_CODE) {
// 解析被调用方UIAbility返回的信息
let info = data.want?.parameters?.info;
hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(info) ?? '');
if (info !== null) {
promptAction.showToast({
message: JSON.stringify(info)
});
}
}
- 在FuncAbility停止自身时,需要调用
terminateSelfWithResult()
方法,入参abilityResult为FuncAbility需要返回给EntryAbility的信息。
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext
const RESULT_CODE: number = 1001;
let abilityResult: common.AbilityResult = {
resultCode: RESULT_CODE,
want: {
bundleName: 'com.samples.stagemodelabilitydevelop',
moduleName: 'entry', // moduleName非必选
abilityName: 'FuncAbilityB',
parameters: {
info: '来自FuncAbility Index页面'
},
},
};
context.terminateSelfWithResult(abilityResult, (err) => {
if (err.code) {
hilog.error(DOMAIN_NUMBER, TAG, `Failed to terminate self with result. Code is ${err.code}, message is ${err.message}`);
return;
}
});
- FuncAbility停止自身后,EntryAbility通过
startAbilityForResult()
方法回调接收被FuncAbility返回的信息,RESULT_CODE需要与前面的数值保持一致。
启动UIAbility的指定页面
概述
调用方UIAbility指定启动页面
调用方UIAbility启动另外一个UIAbility时,通常需要跳转到指定的页面。
例如FuncAbility包含两个页面(Index对应首页,Second对应功能A页面),此时需要在传入的want参数中配置指定的页面路径信息,可以通过want中的parameters参数增加一个自定义参数传递页面跳转信息。
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext
let want: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.samples.stagemodelabilityinteraction',
moduleName: 'entry', // moduleName非必选
abilityName: 'FuncAbility',
parameters: { // 自定义参数传递页面信息
router: 'funcA'
}
};
// context为调用方UIAbility的UIAbilityContext
context.startAbility(want).then(() => {
hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in starting ability.');
}).catch((err: BusinessError) => {
hilog.error(DOMAIN_NUMBER, TAG, `Failed to start ability. Code is ${err.code}, message is ${err.message}`);
});
目标UIAbility冷启动
目标UIAbility冷启动时,在目标UIAbility的onCreate()
生命周期回调中,接收调用方传过来的参数。然后再目标UIAbility的onWindowStageCreate()
生命周期回调中,解析EntryAbility传递过来的want参数,获取到需要加载的页面信息url,传入windowStage.loadContent()
方法。
import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window, UIContext } from '@kit.ArkUI';
const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';
export default class EntryAbility extends UIAbility {
funcAbilityWant: Want | undefined = undefined;
uiContext: UIContext | undefined = undefined;
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 接收调用方UIAbility传过来的参数
this.funcAbilityWant = want;
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
// Main window is created, set main page for this ability
let url = 'pages/Index';
if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {
url = 'pages/Page_ColdStartUp';
}
windowStage.loadContent(url, (err, data) => {
// ...
});
}
}
目标UIAbility热启动
在应用开发中,会遇到目标UIAbility实例之前已经启动过的场景,这时再次启动目标UIAbility时,不会重新走初始化逻辑,只会直接触发onNewWant()生命周期方法。为了实现跳转到指定页面,需要在onNewWant()中解析参数进行处理。
例如短信应用和联系人应用配合使用的场景。
- 用户先打开短信应用,短信应用的UIAbility实例启动,显示短信应用的主页。
- 用户将设备回到桌面界面,短信应用进入后台运行状态。
- 用户打开联系人应用,找到联系人张三。
- 用户点击联系人张三的短信按钮,会重新启动短信应用的UIAbility实例。
- 由于短信应用的UIAbility实例已经启动过了,此时会触发该UIAbility的
onNewWant()
回调,而不会再走onCreate()
和onWindowStageCreate()
等初始化逻辑。
开发步骤如下所示。
- 冷启动短信应用的UIAbility实例时,在onWindowStageCreate()生命周期回调中,通过调用
getUIContext()
接口获取UI上下文实例UIContext
对象。
import { hilog } from '@kit.PerformanceAnalysisKit';
import { Want, UIAbility } from '@kit.AbilityKit';
import { window, UIContext } from '@kit.ArkUI';
const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';
export default class EntryAbility extends UIAbility {
funcAbilityWant: Want | undefined = undefined;
uiContext: UIContext | undefined = undefined;
// ...
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
let url = 'pages/Index';
if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {
url = 'pages/Page_ColdStartUp';
}
windowStage.loadContent(url, (err, data) => {
if (err.code) {
return;
}
let windowClass: window.Window;
windowStage.getMainWindow((err, data) => {
if (err.code) {
hilog.error(DOMAIN_NUMBER, TAG, `Failed to obtain the main window. Code is ${err.code}, message is ${err.message}`);
return;
}
windowClass = data;
this.uiContext = windowClass.getUIContext();
});
hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
});
}
}
- 在短信应用UIAbility的
onNewWant()
回调中解析嗲用方法传递过来的want参数,通过调用UIContext中的getRouter()
方法获取Router对象,并进行指定页面的跳转。此时再次启动该短信应用的UIAbility实例时,即可跳转到该短信应用的UIAbility实例的指定页面。
import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import type { Router, UIContext } from '@kit.ArkUI';
import type { BusinessError } from '@kit.BasicServicesKit';
const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';
export default class EntryAbility extends UIAbility {
funcAbilityWant: Want | undefined = undefined;
uiContext: UIContext | undefined = undefined;
// ...
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
if (want?.parameters?.router && want.parameters.router === 'funcA') {
let funcAUrl = 'pages/Page_HotStartUp';
if (this.uiContext) {
let router: Router = this.uiContext.getRouter();
router.pushUrl({
url: funcAUrl
}).catch((err: BusinessError) => {
hilog.error(DOMAIN_NUMBER, TAG, `Failed to push url. Code is ${err.code}, message is ${err.message}`);
});
}
}
}
}