2024-02-21 UIAbility应用程序框架与路由管理
UIAbility概念
一个应用可以有一个UIAbility,也可以有多个UIAbility
一个UIAbility可以对应于多个页面,建议将一个独立的功能模块放到一个UIAbility中,以多页面的形式呈现
45726-501969e9999b44d9.jpeg
配置UIAbility入口
./HelloWorld/entry/src/main/module.json5
UIAbility应用框架生命周期 和窗口管理之间的关系
为了实现多设备形态上的裁剪和多窗口的可扩展性,系统对组件管理和窗口管理进行了解耦。UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,
WindowStageCreate和WindowStageDestroy为窗口管理器(WindowStage)在UIAbility中管理UI界面功能的两个生命周期回调,从而实现UIAbility与窗口之间的弱耦合。
UIAbility生命周期状态:
45726-46fca56111b5ee9f.jpeg
UIAbility第一个页面
UIAbility生命周期,在这个文件中实现:
./HelloWorld/entry/src/main/ets/entryability/EntryAbility.ts
使用窗口管理对象windowStage加载第一个页面
windowStage.loadContent('pages/Index', (err, data) => {
});
UIAbility窗口管理回调用的方法:
/*窗口管理器(WindowStage)*/
onWindowStageCreate(windowStage: window.WindowStage) {
// 正在打游戏的时候,有一个消息通知,打开消息,消息会以弹窗的形式弹出在游戏应用的上方,
// 此时,游戏应用就从获焦切换到了失焦状态,消息应用切换到了获焦状态
//UI界面加载
// Main window is created, set main page for this ability
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
//加载的页面
/*实现UIAbility与窗口之间的弱耦合*/
windowStage.loadContent('pages/Index', (err, data) => {
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. Data: %{public}s', JSON.stringify(data) ?? '');
});
}
UIAbility路由管理
import router from '@ohos.router';
跳转新页面:
router.pushUrl()方法新增了mode参数,可以将mode参数配置为router.RouterMode.Single单实例模式和router.RouterMode.Standard多实例模式。
-
在单实例模式下:
如果目标页面的url在页面栈中已经存在同url页面,离栈顶最近同url页面会被移动到栈顶,移动后的页面为新建页,原来的页面仍然存在栈中,页面栈的元素数量不变; -
按多实例模式跳转:
如果目标页面的url在页面栈中不存在同url页面,按多实例模式跳转,页面栈的元素数量会加1。
router.pushUrl({ url: 'pages/ToDoListPage', params: {
src: '来自首页的数据'
} }, router.RouterMode.Single);
返回上一个页面:
router.back({
url: 'pages/Index',
//调用router.back()方法,不会新建页面,
// 返回的是原来的页面,在原来页面中@State声明的变量不会重复声明,
// 以及也不会触发页面的aboutToAppear()生命周期回调,
// 因此无法直接在变量声明以及页面的aboutToAppear()生命周期回调中接收和解析
// router.back()传递过来的自定义参数。
params: {
'result': '我是处理结果'
}
});
返回上一个页面之前添加询问弹窗:
router.showAlertBeforeBackPage({ message: '确认关闭页面吗?' });
router.back();
从返回页面获取结果
onPageShow() {
console.log('页面显示-onPageShow');
try {
this.result = (router.getParams() as RouterParams).result;
} catch (e) {
console.log(e);
}
}
UIAbility启动模式
对于浏览器或者新闻等应用,用户在打开该应用,并浏览访问相关内容后,回到桌面,再次打开该应用,显示的仍然是用户当前访问的界面。
对于应用的分屏操作,用户希望使用两个不同应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。
对于文档应用,用户从文档应用中打开一个文档内容,回到文档应用,继续打开同一个文档,希望打开的还是同一个文档内容。
基于以上场景的考虑,UIAbility当前支持singleton(单实例模式)、multiton(多实例模式)和specified(指定实例模式)3种启动模式。
-
singleton(单实例模式)
singleton启动模式的开发使用,在module.json5文件中的“launchType”字段配置为“singleton”即可。
{
"module": {
// ...
"abilities": [
{
"launchType": "singleton",
// ...
}
]
}
}
最后的实例运行效果如下:
45726-4b9e7eea5c57d3b9.jpeg