• HarmonyOS之 应用程序页面UIAbility


    一 UIAbility介绍:

    1.1 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互

    1.2 UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面

    二 UIAbility跳转和传参

    2.1 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页面url找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url访问不同的页面,包括跳转到UIAbility内的指定页面、用UIAbility内的某个页面替换当前页面、返回上一页面或指定的页面等

    2.2 在使用页面路由之前,需要先导入router模块,如下代码所示。

    import router from '@ohos.router';

    2.3  跳转页面方式一:router.pushUrl 增加页面,params是传递的参数

    1. router.pushUrl({
    2. url: 'pages/Second',
    3. params: {
    4. src: 'Index页面传来的数据',
    5. }
    6. }, router.RouterMode.Single)

    2.4 跳转页面方式二: router.replaceUrl替换页面,params是传递的参数

    1. router.replaceUrl({
    2. url: 'pages/Second',
    3. params: {
    4. src: 'Index页面传来的数据',
    5. }
    6. }, router.RouterMode.Single)

    2.5 接收参数,通过调用router.getParams()方法获取Index页面传递过来的自定义参数 

    1. import router from '@ohos.router';
    2. @Entry
    3. @Component
    4. struct Second {
    5. @State src: string = router.getParams()?.['src'];
    6. // 页面刷新展示
    7. ...
    8. }

    2.6 效果示意如下图所示。在Index页面中,点击“Next”后,即可从Index页面跳转到Second页面,并在Second页面中接收参数和进行页面刷新展示 

    三 UIAbility返回上一页面和传参

    3.1 返回页面:调用router.back()方法时增加可选的options参数(增加url参数)返回到指定页面

    返回上一个页面

    router.back();

    3.2 返回指定页面,并传参

    1. router.back({
    2. url: 'pages/Index',
    3. params: {
    4. src: 'Second页面传来的数据',
    5. }
    6. })

    3.3 返回页面接收参数

    1. import router from '@ohos.router';
    2. @Entry
    3. @Component
    4. struct Index {
    5. @State src: string = '';
    6. onPageShow() {
    7. this.src = router.getParams()?.['src'];
    8. }
    9. // 页面刷新展示
    10. ...
    11. }

    3.4 效果示意图如下图所示。在Second页面中,点击“Back”后,即可从Second页面返回到Index页面,并在Index页面中接收参数和进行页面刷新展示

     

    四  UIAbility生命周期

    4.1 生命周期图示

    4.2 Create:

    在UIAbility实例创建时触发,系统会调用onCreate回调。可以在onCreate回调中进行相关初始化操作 

    1. import UIAbility from '@ohos.app.ability.UIAbility';
    2. import window from '@ohos.window';
    3. export default class EntryAbility extends UIAbility {
    4. onCreate(want, launchParam) {
    5. // 应用初始化
    6. ...
    7. }
    8. ...
    9. }

    4.3 onWindowStageCreate:

    UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStage。每一个UIAbility实例都对应持有一个WindowStage实例,可以在onWindowStageCreate回调中,设置UI页面加载、设置WindowStage的事件订阅

    1. import UIAbility from '@ohos.app.ability.UIAbility';
    2. import window from '@ohos.window';
    3. export default class EntryAbility extends UIAbility {
    4. ...
    5. onWindowStageCreate(windowStage: window.WindowStage) {
    6. // 设置UI页面加载
    7. // 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)
    8. ...
    9. windowStage.loadContent('pages/Index', (err, data) => {
    10. ...
    11. });
    12. }
    13. ...
    14. }

    4.4 onForeground:

    在UIAbility的UI页面可见之前,即UIAbility切换至前台时触发。可以在onForeground回调中申请系统需要的资源,或者重新申请在onBackground中释放的资源

    1. import UIAbility from '@ohos.app.ability.UIAbility';
    2. import window from '@ohos.window';
    3. export default class EntryAbility extends UIAbility {
    4. ...
    5. onForeground() {
    6. // 申请系统需要的资源,或者重新申请在onBackground中释放的资源
    7. ...
    8. }
    9. onBackground() {
    10. // 释放UI页面不可见时无用的资源,或者在此回调中执行较为耗时的操作
    11. // 例如状态保存等
    12. ...
    13. }
    14. }

    4.5 onWindowStageDestroy:

    在UIAbility实例销毁之前,则会先进入onWindowStageDestroy回调,我们可以在该回调中释放UI页面资源

    1. import UIAbility from '@ohos.app.ability.UIAbility';
    2. import window from '@ohos.window';
    3. export default class EntryAbility extends UIAbility {
    4. ...
    5. onWindowStageDestroy() {
    6. // 释放UI页面资源
    7. ...
    8. }
    9. }

    4.6 Destroy:

    在UIAbility销毁时触发。可以在onDestroy回调中进行系统资源的释放、数据的保存等操作

    1. import UIAbility from '@ohos.app.ability.UIAbility';
    2. import window from '@ohos.window';
    3. export default class EntryAbility extends UIAbility {
    4. ...
    5. onDestroy() {
    6. // 系统资源的释放、数据的保存等
    7. ...
    8. }
    9. }

    五 UIAbility启动模式

    5.1 UIAbility当前支持singleton(单实例模式)、multiton(多实例模式)和specified(指定实例模式)3种启动模式

    5.2 singleton(单实例模式):

    • 当用户打开浏览器或者新闻等应用,并浏览访问相关内容后,回到桌面,再次打开该应用,显示的仍然是用户当前访问的界面。

    这种情况下可以将UIAbility配置为singleton(单实例模式)。每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例,系统中只存在唯一一个该UIAbility实例

    1. {
    2. "module": {
    3. ...
    4. "abilities": [
    5. {
    6. "launchType": "singleton",
    7. ...
    8. }
    9. ]
    10. }
    11. }

    5.3 multiton(多实例模式):

    • 用户在使用分屏功能时,希望使用两个不同应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。
    • 这种情况下可以将UIAbility配置为multiton(多实例模式)。每次调用startAbility()方法时,都会在应用进程中创建一个该类型的UIAbility实例
    1. {
    2. "module": {
    3. ...
    4. "abilities": [
    5. {
    6. "launchType": "multiton",
    7. ...
    8. }
    9. ]
    10. }
    11. }

    5.4 specified(指定实例模式):

    • 用户打开文档应用,从文档应用中打开一个文档内容,回到文档应用,继续打开同一个文档,希望打开的还是同一个文档内容;以及在文档应用中新建一个新的文档,每次新建文档,希望打开的都是一个新的空白文档内容。
    • 这种情况下可以将UIAbility配置为specified(指定实例模式)。在UIAbility实例新创建之前,允许开发者为该实例创建一个字符串Key,新创建的UIAbility实例绑定Key之后,后续每次调用startAbility方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility请求。如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。运行时由UIAbility内部业务决定是否创建多实例

    第一步:在module.json5文件中的“launchType”字段配置为“specified”。 

    1. {
    2. "module": {
    3. ...
    4. "abilities": [
    5. {
    6. "launchType": "specified",
    7. ...
    8. }
    9. ]
    10. }
    11. }

    第二步:在调用startAbility()方法的want参数中,增加一个自定义参数来区别UIAbility实例,例如增加一个“instanceKey”自定义参数 

    1. // 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
    2. function getInstance() {
    3. ...
    4. }
    5. let want = {
    6. deviceId: "", // deviceId为空表示本设备
    7. bundleName: "com.example.myapplication",
    8. abilityName: "MainAbility",
    9. moduleName: "device", // moduleName非必选,默认为当前UIAbility所在的Module
    10. parameters: { // 自定义信息
    11. instanceKey: getInstance(),
    12. },
    13. }
    14. // context为启动方UIAbility的AbilityContext
    15. context.startAbility(want).then(() => {
    16. ...
    17. }).catch((err) => {
    18. ...
    19. })

    第三步:在被拉起方UIAbility对应的AbilityStage的onAcceptWant生命周期回调中,解析传入的want参数,获取“instanceKey”自定义参数。根据业务需要返回一个该UIAbility实例的字符串Key标识。如果之前启动过此Key标识的UIAbility,则会将之前的UIAbility拉回前台并获焦,而不创建新的实例,否则创建新的实例并启动。

    1. onAcceptWant(want): string {
    2. // 在被启动方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值
    3. // 当前示例指的是device Module的EntryAbility
    4. if (want.abilityName === 'MainAbility') {
    5. return `DeviceModule_MainAbilityInstance_${want.parameters.instanceKey}`;
    6. }
    7. return '';
    8. }
  • 相关阅读:
    使用 Spring Boot 构建 RESTful API 的最佳实践
    第二套.py
    基于SpringBoot的漫画网站设计与实现
    ELK企业级日志分析系统
    LSTM-Attention单维时间序列预测研究(Matlab代码实现)
    如何阅读一本书(上)
    Spring Boot 日志文件
    【python海洋专题二十五】给南海年平均海流+scale
    ElasticSearch--配置--大全/详解
    一种基于局部适应度景观的进化规划的混合策略
  • 原文地址:https://blog.csdn.net/qq_29848853/article/details/133129452