2024-02-21 UIAbility应用程序框架与路由管理

2024-02-20  本文已影响0人  我是小胡胡123

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多实例模式。

 
        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启动模式的开发使用,在module.json5文件中的“launchType”字段配置为“singleton”即可。

{
   "module": {
     // ...
     "abilities": [
       {
         "launchType": "singleton",
         // ...
       }
     ]
  }
}

最后的实例运行效果如下:


45726-4b9e7eea5c57d3b9.jpeg
上一篇 下一篇

猜你喜欢

热点阅读