UIAbility的使用

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页面中接收参数和进行页面刷新展示。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值