1. 什么是 UIAbility?
- 相当于界面框架,当我们启动一个手机app程序,就会自然而然开启一个界面框架。每一个程序至少有一个UIAbility。
- 每一个 UIAbility 实例,都对应于一个最近任务列表中的任务。
- UIAbility 是一种包含用户界面的应用组件,主要用于和用户进行交互。交互形式有如下三种:
3.1 点击桌面图标进入应用
3.2 从一个应用拉起另外一个应用
3.3 最近任务列表切回应用 - 一个应用可以有一个 UIAbility,也可以有多个 UIAbility。
- 一个 UIAbility 可以有多个页面,并且可以互相跳转。
// 窗口舞台创建的时候
onWindowStageCreate(windowStage: window.WindowStage): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
// 一个 Ability 可以有多个页面,并且可以互相跳转。配置加载哪个页面。
windowStage.loadContent('pages/Index', (err) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
});
}
2. UIAbility 组件生命周期钩子函数
2.1 UIAbility 组件生命周期钩子函数:
- onCreate(): 状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate() 回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。
- onForeground(): UIAbility切换至前台时触发,可在该函数中加载所需的系统资源。
- onBackground(): UIAbility切换至后台时候触发,可在该函数中释放系统资源。
- onDestroy(): UIAbility实例销毁时触发,可在该函数中释放系统资源,保存数据。
2.2 WindowStage 生命周期钩子函数:
- onWindowStageCreate(): 窗口舞台搭建时,页面只会被创建一次,UIAbility来回切换,会来回调用onForeground() 和 onBackground(),不会再调用 onWindowStageCreate()。可在该函数中设置应用加载的初始页面。
- onWindowStageDestroy(): 也只调用一次。
2.3 整个生命周期钩子函数:
UIAbility Start > onCreate() > onWindowStageCreate() > onForeground() > onBackground() > onWindowStageDestroy() > onDestroy() > UIAbility End
3 UIAbility 组件启动模式
3.1 配置默认启动页:如果我们在一个 entry 模块添加名字为 TwoAbility 的 UIAbility,可以修改 entry > src > main > module.json5 配置文件,来修改应用程序的默认启动入口为 TwoAbility。只需要把 exported
和 skills
这俩个属性放在需要默认启动的 ability 对象里就OK。
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:EntryAbility_desc",
"icon": "$media:layered_image",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
},
{
"name": "TwoAbility",
"srcEntry": "./ets/twoability/TwoAbility.ets",
"description": "$string:TwoAbility_desc",
"icon": "$media:layered_image",
"label": "$string:TwoAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
]
}
]
4 UIAbility 组件基本用法
5 UIAbility 组件与UI的数据同步
6 UIAbility 组件间交互(设备内)
6.1 在同一个模块,从一个 UIAbility 唤起另一个 UIAbility。
- 准备
want
作为 UIAbility 实例启动的入口参数 - 利用上下文对象
context
的startAbility()
方法,传入 want 参数来启动另一个 UIAbility。
context = getContext(this) as common.UIAbilityContext
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication', // AppScope/app.json5
abilityName: 'TwoAbility', // 需要唤起的UIAbility的name 。entry/src/main/module.json5
moduleName: 'entry', // 模块名,非必选
parameters: { // 自定义信息
info: '来自EntryAbility Index页面',
},
}
// context为 调用方UIAbility 的 AbilityContext。返回一个 Promise 对象。
this.context.startAbility(wantInfo).then(() => {
// ...
}).catch((error: BusinessError) => {
// ...
})
6.2 在不同的模块(跨模块),从一个 UIAbility 唤起另一个 UIAbility。
- 准备
want
作为 UIAbility 实例启动的入口参数 - 利用上下文对象
context
的startAbility()
方法,传入 want 参数来启动另一个 UIAbility。 - 修改 DevEco Studio 编辑配置,选择 Deploy Multi Hap
context = getContext(this) as common.UIAbilityContext
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication', // AppScope/app.json5
abilityName: 'TestModuleAbility', // 需要唤起的UIAbility的name 。TestModule/src/main/module.json5
moduleName: 'TestModule', // 模块名,非必选
parameters: { // 自定义信息
info: '来自EntryAbility Index页面',
},
}
// context为 调用方UIAbility 的 AbilityContext。返回一个 Promise 对象。
this.context.startAbility(wantInfo).then(() => {
// ...
}).catch((error: BusinessError) => {
// ...
})