一、UIAbility概述
1、
UIAbility
是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility
也是系统调度的单元,为应用提供窗口在其中绘制界面。
2、每一个UIAbility
实例,都对应于一个最近任务列表中的任务。
3、一个应用可以有一个UIAbility
,也可以有多个UIAbility
,如下图所示。例如浏览器应用可以通过一个UIAbility
结合多页面的形式让用户进行的搜索和浏览内容;而聊天应用增加一个“外卖功能”的场景,则可以将聊天应用中“外卖功能”的内容独立为一个UIAbility
,当用户打开聊天应用的“外卖功能”,查看外卖订单详情,此时有新的聊天消息,即可以通过最近任务列表切换回到聊天窗口继续进行聊天对话。
4、一个UIAbility
可以对应于多个页面,建议将一个独立的功能模块放到一个UIAbility
中,以多页面的形式呈现。例如新闻应用在浏览内容的时候,可以进行多页面的跳转使用。
二、UIAbility内页面的跳转和数据传递
UIAbility
的数据传递包括有UIAbility
内页面的跳转和数据传递、UIAbility
间的数据跳转和数据传递,本章节主要讲解UIAbility内页面的跳转和数据传递。在一个应用包含一个UIAbility
的场景下,可以通过新建多个页面来实现和丰富应用的内容。这会涉及到UIAbility
内页面的新建以及UIAbility
内页面的跳转和数据传递。打开DevEco Studio
,选择一个Empty Ability
工程模板,创建一个工程,例如命名 MyApplication
。
- 在
src/main/ets/entryability
目录下,初始会生成一个UIAbility文件EntryAbility.ts。可以在EntryAbility.ts文件中根据业务需要实现UIAbility的生命周期回调内容。 - 在
src/main/ets/pages
目录下,会生成一个Index
页面。这也是基于UIAbility
实现的应用的入口页面。可以在Index
页面中根据业务需要实现入口页面的功能。 - 在
src/main/ets/pages
目录下,右键New->Page
,新建一个Second
页面,用于实现页面间的跳转和数据传递。
为了实现页面的跳转和数据传递,需要新建一个页面。在原有Index页面的基础上,新建一个页面,例如命名为Second.ets
。
页面间的导航可以通过页面路由router
模块来实现。页面路由模块根据页面url
找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url
访问不同的页面,包括跳转到UIAbility
内的指定页面、用UIAbility内的某个页面替换当前页面、返回上一页面或指定的页面等。具体使用方法请参见ohos.router
(页面路由)。
2.1 页面跳转和参数接收
在使用页面路由之前,需要先导入router
模块,如下代码所示。
import router from '@ohos.router';
页面跳转的几种方式,根据需要选择一种方式跳转即可。
方式一:API9及以上,router.pushUrl()
方法新增了mode
参数,可以将mode
参数配置为router.RouterMode.Single
单实例模式和router.RouterMode.Standard
多实例模式。
在单实例模式下:如果目标页面的url
在页面栈中已经存在同url
页面,离栈顶最近同url
页面会被移动到栈顶,移动后的页面为新建页,原来的页面仍然存在栈中,页面栈的元素数量不变;如果目标页面的url
在页面栈中不存在同url
页面,按多实例模式跳转,页面栈的元素数量会加1。
说明
- 当页面栈的元素数量较大或者超过32时,可以通过调用
router.clear()
方法清除页面栈中的所有历史页面,仅保留当前页面作为栈顶页面。
router.pushUrl({
url: 'pages/Second',
params: {
src: 'Index页面传来的数据',
}
}, router.RouterMode.Single)
方式二:API9及以上,router.replaceUrl()
方法新增了mode
参数,可以将mode
参数配置为router.RouterMode.Single
单实例模式和router.RouterMode.Standard
多实例模式。
- 在单实例模式下:如果目标页面的
url
在页面栈中已经存在同url页面,离栈顶最近同url
页面会被移动到栈顶,替换当前页面,并销毁被替换的当前页面,移动后的页面为新建页,页面栈的元素数量会减1;如果目标页面的url在页面栈中不存在同url页面,按多实例模式跳转,页面栈的元素数量不变。
router.replaceUrl({
url: 'pages/Second',
params: {
src: 'Index页面传来的数据',
}
}, router.RouterMode.Single)
已经实现了页面的跳转,接下来,在Second
页面中如何进行自定义参数的接收呢?通过调用router.getParams()
方法获取Index
页面传递过来的自定义参数。
import router from '@ohos.router';
@Entry
@Component
struct Second {
@State src: string = (router.getParams() as Record<string, string>)['src'];
// 页面刷新展示
// ...
}
效果示意如下图所示。在Index页面中,点击“Next”后,即可从Index
页面跳转到Second
页面,并在Second
页面中接收参数和进行页面刷新展示。
2.2 页面返回和参数接收
经常还会遇到一个场景,在Second
页面中,完成了一些功能操作之后,希望能返回到Index
页面,那我们要如何实现呢?
在Second
页面中,可以通过调用router.back()
方法实现返回到上一个页面,或者在调用router.back()
方法时增加可选的options
参数(增加url
参数)返回到指定页面。
说明
- 调用
router.back()
返回的目标页面需要在页面栈中存在才能正常跳转。 - 例如调用
router.pushUrl()
方法跳转到Second
页面,在Second
页面可以通过调用router.back()
方法返回到上一个页面。 - 例如调用
router.clear()
方法清空了页面栈中所有历史页面,仅保留当前页面,此时则无法通过调用router.back()
方法返回到上一个页面。 - 返回上一个页面。
router.back();
- 返回到指定页面。
router.back({ url: 'pages/Index' });
效果示意如下图所示。在Second页面中,点击“Back”后,即可从Second页面返回到Index页面。
页面返回可以根据业务需要增加一个询问对话框。
即在调用router.back()
方法之前,可以先调用router.enableBackPageAlert()
方法开启页面返回询问对话框功能。
说明
router.enableBackPageAlert()
方法开启页面返回询问对话框功能,只针对当前页面生效。例如在调用router.pushUrl()
或者router.replaceUrl()
方法,跳转后的页面均为新建页面,因此在页面返回之前均需要先调用router.enableBackPageAlert()
方法之后,页面返回询问对话框功能才会生效。- 如需关闭页面返回询问对话框功能,可以通过调用
router.disableAlertBeforeBackPage()
方法关闭该功能即可。
router.enableBackPageAlert({
message: 'Message Info'
});
router.back();
在Second
页面中,调用router.back()
方法返回上一个页面或者返回指定页面时,根据需要继续增加自定义参数,例如在返回时增加一个自定义参数src
。
router.back({
url: 'pages/Index',
params: {
src: 'Second页面传来的数据',
}
})
从Second
页面返回到Index
页面。在Index
页面通过调用router.getParams()
方法,获取Second
页面传递过来的自定义参数。
说明
调用router.back()
方法,不会新建页面,返回的是原来的页面,在原来页面中@State
声明的变量不会重复声明,以及也不会触发页面的aboutToAppear()
生命周期回调,因此无法直接在变量声明以及页面的aboutToAppear()
生命周期回调中接收和解析router.back()
传递过来的自定义参数。
可以放在业务需要的位置进行参数解析。示例代码在Index
页面中的onPageShow()
生命周期回调中进行参数的解析。
import router from '@ohos.router';
class routerParams {
src:string
constructor(str:string) {
this.src = str
}
}
@Entry
@Component
struct Index {
@State src: string = '';
onPageShow() {
this.src = (router.getParams() as routerParams).src
}
// 页面刷新展示
// ...
}
效果示意图如下图所示。在Second
页面中,点击“Back”后,即可从Second
页面返回到Index
页面,并在Index
页面中接收参数和进行页面刷新展示。
由于内容过长,在同一篇博文中,会显得过长。
-
第三大点( UIAbility的生命周期)
-
第四大点(UIAbility的启动模式)
在下一篇系列里继续接上,请有兴趣的童鞋持续关注更新。