鸿蒙 Stage模型-应用组件-配置、UIAbility

本文对比了Ohos操作系统中的UIAbility和ExtensionAbility,探讨了它们的概念、模块、生命周期、启动模式、数据传递机制以及ExtensionAbility组件的用途。重点介绍了配置文件、EventHub通信和数据同步策略,以及与Android类似的组件模型和功能实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:基于官网3.1/4.0文档。参考官网文档
基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌)

一、概念

在这里插入图片描述
可以看到分为运行期、编译器,主要关注UIAbility(类似Activity,UI相关)、ExtensionAbility(其他非UI相关)。
另外AbilityState暂时不确定是类似Android 中的Application。

为什么会单独有个Stage模型?
其实就是整体架构,只不过为了区分另外一个```Feature模型``,后者已经不主推。

二、模块

1.配置

.json5文件为配置文件,分为:
app.json5:app级别的配置
module.json5:模块级别的配置

示例:

{
   
   
  "module": {
   
   
    // ...
    "abilities": [
      {
   
   
        // $开头的为资源值
        "icon": "$media:icon",
        "label": "$string:EntryAbility_label",
        "skills": [
          {
   
   
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
      }
    ]
  }
}

通过json文件来配置,也是和之前

2.UIAbility

是什么?
类似Activity

1.生命周期

在这里插入图片描述

onNewIntent等生命周期是否有?
有,见如下

2.启动模式

singleton(单实例模式):与Android一致,配置文件中配置
multiton(多实例模式):对应Android的standard
specified(指定实例模式):对Ability标记key,一致的key则是统一Ability。

针对第三种模式示例:
1.配置

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

2.启动

// 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
// 例如在文档使用场景中,可以用文档路径作为Key标识
function getInstance() {
   
   
    // ...
}

let want = {
   
   
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必选
    parameters: {
   
    // 自定义信息
        instanceKey: getInstance(),
    },
}
// context为调用方UIAbility的AbilityContext
this.context.startAbility(want).then(() => {
   
   
    // ...
}).catch((err) => {
   
   
    // ...
})

这里可以看到,startAbility=startActivity,传递的数据的方式也是类似。

3.监听


                
<think>好的,我现在需要回答用户关于鸿蒙Stage模型如何进行跳转的问题。首先,我得回忆一下鸿蒙系统的相关知识,特别是Stage模型的设计和页面跳转机制。鸿蒙Stage模型应用开发的基础架构,它基于Ability和AbilitySlice的概念。用户可能想知道如何在这样的模型下实现页面之间的跳转,比如从一个页面跳转到另一个页面,或者传递参数等。 首先,我应该明确Stage模型中的核心组件,即UIAbility和WindowStageUIAbility代表一个具有用户界面的能力单元,而WindowStage管理窗口信息。页面跳转通常发生在UIAbility之间或者同一UIAbility内的不同页面。这里可能需要区分两种跳转方式:同一UIAbility内的页面跳转,以及不同UIAbility之间的跳转。 对于同一UIAbility内的跳转,通常使用页面路由router来实现。例如,使用router.pushUrl()方法导航到另一个页面。需要确保目标页面已经配置在路由表中,并且正确使用资源管理符$r。 如果是不同UIAbility之间的跳转,可能需要使用startAbility()方法,并构造一个包含目标Ability信息的Want对象。这里需要传递目标Ability的bundleName和abilityName,可能还需要参数。 接下来,我需要考虑代码示例的正确性。例如,在同一UIAbility内跳转时,如何在当前页面的JavaScript或ArkTS代码中调用路由方法。同时,要注意导入必要的模块,比如@ohos.router。 另外,参数传递也是一个重要部分。用户可能需要在跳转时携带数据,比如通过params参数传递对象。接收页面则需要通过router.getParams()来获取这些参数。 还需要提到页面返回的处理,比如调用router.back()方法,并处理可能的返回参数。这涉及到前后页面之间的数据传递,尤其是在返回时可能需要更新前一个页面的状态。 另外,不同UIAbility之间的跳转需要声明权限,尤其是在跨应用跳转时,需要在配置文件中请求相应的权限,比如ohos.permission.START_ABILITIES_FROM_BACKGROUND。 还需要注意一些常见的注意事项,比如路由配置是否正确,目标Ability是否已注册,以及参数传递时的类型和大小限制。这些细节可以帮助用户避免常见的错误。 最后,要确保回答结构清晰,分步骤说明,并提供示例代码。同时,使用中文,避免技术术语过于晦涩,让用户能够逐步理解和操作。检查LaTeX格式是否符合要求,确保行内公式用$...$,独立公式用$$...$$,虽然这个问题可能不涉及太多数学公式,但如果有提到版本号或其他需要强调的数值,可能需要使用正确的格式。 总结一下,回答应该包括: 1. Stage模型的基本概念 2. 同一UIAbility内的页面跳转(使用router) 3. 不同UIAbility之间的跳转(使用Want和startAbility) 4. 参数传递的方法 5. 返回页面的处理 6. 注意事项和常见问题 确保每个部分都有代码示例和必要的说明,帮助用户实际应用这些步骤。同时,检查代码语法是否正确,比如ArkTS中的导入语句和方法调用是否符合规范。</think>在鸿蒙HarmonyOS)的Stage模型中,页面跳转主要通过 **UIAbility** 和 **页面路由(Router)** 实现。以下是详细步骤和关键方法: --- ### 一、Stage模型跳转核心机制 Stage模型以 **UIAbility** 为独立单元管理界面,通过 **WindowStage** 管理窗口信息。跳转分为两类: 1. **同一UIAbility内页面跳转**(如A页面→B页面) 2. **跨UIAbility跳转**(如AbilityA→AbilityB) --- ### 二、同一UIAbility内的页面跳转 使用 **页面路由(Router)** 实现,需提前配置路由表。 #### 1. 配置路由表 在 `resources/base/profile/main_pages.json` 中定义页面路径: ```json { "src": [ "pages/Index", "pages/Detail" ] } ``` #### 2. 执行跳转 在代码中调用 `router.pushUrl()`: ```typescript import router from '@ohos.router'; // 跳转到Detail页面(无参数) router.pushUrl({ url: 'pages/Detail' }); // 携带参数跳转 router.pushUrl({ url: 'pages/Detail', params: { id: 123, name: 'HarmonyOS' } }); ``` #### 3. 接收参数 在目标页面通过 `router.getParams` 获取参数: ```typescript import router from '@ohos.router'; const params = router.getParams(); console.log(`Received ID: ${params['id']}`); // 输出:Received ID: 123 ``` --- ### 三、跨UIAbility跳转 使用 **Want** 对象指定目标Ability,并通过 `startAbility()` 触发跳转。 #### 1. 发起跳转 ```typescript import UIAbility from '@ohos.app.ability.UIAbility'; import Want from '@ohos.app.ability.Want'; // 在源Ability中跳转 let want: Want = { deviceId: '', // 空表示本设备 bundleName: 'com.example.targetapp', abilityName: 'TargetAbility', parameters: { key: 'value' } // 可选参数 }; this.context.startAbility(want).catch((err) => { console.error(`跳转失败: ${err.code}`); }); ``` #### 2. 目标Ability声明 在 `module.json5` 中注册Ability: ```json { "module": { "abilities": [ { "name": "TargetAbility", "srcEntry": "./ets/targetability/TargetAbility.ts", "exported": true // 允许外部调用 } ] } } ``` --- ### 四、返回上一页面 使用 `router.back()` 返回,支持传递参数: ```typescript // 返回上一页 router.back(); // 返回并传递参数 router.back({ url: 'pages/Index', params: { result: 'success' } }); ``` --- ### 五、注意事项 1. **路由配置**:确保 `main_pages.json` 中包含目标页面。 2. **跨应用权限**:跨Ability跳转需在 `module.json5` 声明权限: ```json "requestPermissions": [ { "name": "ohos.permission.START_ABILITIES_FROM_BACKGROUND" } ] ``` 3. **参数限制**:传递对象需可序列化,避免过大。 4. **生命周期**:跳转时原页面的 `onPageHide` 和目标页面的 `onPageShow` 会被触发。 --- 通过上述方法,可在鸿蒙Stage模型中灵活实现页面导航与数据传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganshenml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值