​​基于uiAbility最新的Stage 模型,旧版本的FA不再讨论

UIAbility 和 page

UIAbility是系统调度的基础单元,相当于独立的应用窗口

page是UIAbility内部的视图容器,通过路由机制实现跳转

一个 UIAbility 可托管多个 Page(类似单 Activity 多 Fragment)

UIAbility生命周期有onCreate/onDestroy等

建议将独立功能模块封装为UIAbility,通过多Page实现功能内页面流转
Stage模型允许在单个Module内定义多个UIAbility,适用于需要独立窗口或功能的场景(如支付应用中同时存在入口功能和收付款功能)

每个UIAbility运行在单独的进程中

启动UIAbility时通过startAbility或startAbilityForResult传递参数,这与安卓的activity启动方式一致的.安卓的页面就是一个activity,他作为最终的页面单位,但是鸿蒙系统中UIAbility里面可以有很多page组件,这些page作为最终的页面容器,UIAbility更像是安卓activity里面的window对象

所有 Page 需在 module.json5中注册

这没什么说的,安卓,vue项目等,几乎所有的类似项目都需要注册,包括 name、label和 actions

生命周期只有四个方法,安卓有6个

aboutToAppear() 页面即将显示
onPageShow()页面完全显示
onPageHide()页面完全不可见(不会因半屏弹窗或局部遮挡触发)
aboutToDisappear()页面即将不可见

数据加载建议:

aboutToAppear() 加载,但要判断是否需要加载,一些不必要实时刷新的数据,可以判断如果加载完成了就不需要再次加载了​​,当然,所有的网络加载都建议使用异步加载
页面消失前取消加载,可以在aboutToDisappear()里面

注意:build()里面不要加载数据

而应该像vue.js里面提供数据加载的结构体方法,在结构体方法里面去加载.build()里面全部处理ui相关的事务.build就像安卓的xml布局文件一样用就行了.官方推荐的方式,我们也应该区分开,让代码更加整洁,同时官方的说法是性能更高

页面跳转控制

​​新版路由 API 核心方法​​

跳转到新页面,保留当前页面(压栈)router.push({ url: ‘pages/DetailPage’ })

替换当前页面,销毁原页面(无法返回)router.replace({ url: ‘pages/LoginPage’ })

​​返回上一页(可传参)router.back({ url: ‘pages/HomePage’ })

​​清空页面栈并跳转到指定页面router.clear({ url: ‘pages/HomePage’ })

// 跳转时传参(参数直接合并到配置对象)
router.push({
  url: 'pages/DetailPage',
  params: { 
    id: 123,
    mode: 'single' // 指定路由模式(single/standard)这个特殊的key必须注意一下
  }
});

// 目标页面获取参数
aboutToAppear() {
  const params = router.getParams(); // { id: 123, mode: 'single' }
  const id = Number(params.id||0; //安全健壮的写法
}
// 全局前置守卫
router.addBeforeHook((to, from, next) => {
  if (to.url === Routes.Detail && !isLogin) {
    next({ url: Routes.Login }); // 重定向
  } else {
    next();
  }
});
//监听路由变化
router.addObserver((to, from) => {
  console.log(`从 ${from?.url} 跳转到 ${to.url}`);
});

启动模式

与安卓的4种不同,只有2种标准启动模式还有一种自定义
singleton->单例模式
multiton ->对应安卓标准模式
specified->自定义逻辑,通过 AbilityStage.onAcceptWant()动态决定实例复用或新建,需开发者自定义逻辑,这个就不展开研究了

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐