UIAbility概述
UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility也是系统调度的单元,为应用提供一系列的窗口,应用在这些窗口里绘制用户交互界面。
每一个UIAbility实例,都对应于一个最近任务列表中的任务。
一个应用可以有一个UIAbility,也可以有多个UIAbility。一个UIAbility可以对应于多个页面,建议将一个独立的功能模块放到一个UIAbility中,以多页面的形式呈现。
UIAbility内页面的跳转和数据传递
UIAbility的数据传递:UIAbility内页面的跳转和数据传递
UIAbility之间的页面跳转和数据传递
在一个应用包含一个UiAbility的场景下,可以通过新建多个页面来实现和丰富应用的内容---UIAbility内页面的新建以及UIAbility内页面的跳转和数据传递。
一个实例:
打开devEcoStudio,选择EmptyAbility工程模板,创建一个工程,命名为MApp。
- 在src/main/ets/entryability/路径下,初始化工程时会生成一个UIAbility文件EntryAbility.ts。可以在EntryAbility.ts文件中根据业务需要实现UIAbility的生命周期回调内容。
- 在src/main/ets/pages路径下,会生成一个Index页面。这也是基于UIAbility实现的应用的入口页面。可以在Index页面中根据业务需要实现入口页面的功能。
- 在src/main/ets/pages路径下,右键new->page,新建一个second页面,用于实现页面间的跳转的数据传递。第二个页面命名为sec.ets
页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页面url找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url访问不同的页面,包括跳转到UIAbility内的指定页面、用UIAbility内的某个页面替换当前页面、返回上一页面或指定的页面等。
页面跳转和参数接收
在使用页面路由之前,需要先导入router模块,如下代码所示
import router from '@ohos.router'
页面跳转的几种方式:
- router.pushUrl()方法 --- 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)
- router.replaceUrl()方法---API9及以上,router.replaceUrl()方法也新增了mode参数,可以配置为router.RouterMode.Single单实例模式和router.RouterMode.Standard多实例模式。在单实例模式下:如果目标页面的url在页面栈中已经存在了同url页面,离栈顶最近的同url页面会被移动到栈顶,替换当前页面,并销毁被替换的当前页面,移动后的页面为新建页,页面栈的元素会减一;如果目标页面的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页面中接收参数和进行页面刷新展示。
页面返回和参数接收
经常还会遇到一个场景,在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()或者route.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.getParam()方法,获取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页面中接收参数和进行页面刷新展示。