当前位置: 首页 > news >正文

《HarmonyOSNext终极UIAbility手册:从启动模式到页面跳转,一网打尽!》

《HarmonyOSNext终极UIAbility手册:从启动模式到页面跳转,一网打尽!》

##Harmony OS Next ##Ark Ts ##教育

本文适用于教育科普行业进行学习,有错误之处请指出我会修改。


🤔 AbilityStage是啥?

简单说就是每个Module的专属管家!当你的HAP文件第一次加载时,系统会自动创建这个管家实例,负责Module的初始化操作~

💡 关键点:

  • 🫶 一对一关系:1个Module = 1个AbilityStage
  • ⚠️ 默认不生成:DevEco Studio不会自动创建,得自己动手!

🔧 手动创建步骤(超简单!)

1️⃣ 右键点击Module的ets目录 → New > Directory → 新建文件夹命名为`myabilitystage`  
2️⃣ 右键点击myabilitystage → New > ArkTS File → 新建文件`MyAbilityStage.ets`  
3️⃣ 写入核心代码 ↓↓↓
import { AbilityStage, Want } from '@kit.AbilityKit';export default class MyAbilityStage extends AbilityStage {onCreate(): void {// 💫 首次加载时触发!搞初始化最合适(比如加载资源/开线程)}onAcceptWant(want: Want): string {// 🎯 仅specified模式触发!return 'MyAbilityStage';}
}

⚙️ 配置文件别漏啦!

module.json5里加个入口声明,否则不生效!

{"module": {"name": "entry","type": "entry","srcEntry": "./ets/myabilitystage/MyAbilityStage.ets", // 🚨重点在这里!// ...}
}

⏳ 生命周期回调大全

AbilityStage有4种核心能力,按需取用 ⤵️

回调函数 🎛️触发场景 🔥典型用途 💼
onCreate()Module首次加载时初始化资源/线程 ✨
onAcceptWant()specified模式启动UIAbility特殊启动逻辑定制 ⚡️
onConfigurationUpdated()系统配置变更(语言/深色模式等)动态适配新配置 🌓
onMemoryLevel()系统内存不足时紧急释放资源 🆘

🚨 内存优化必看!

系统在后台会缓存应用,但内存不足时会强杀进程! 通过onMemoryLevel()及时清理资源保命 👇

import { AbilityStage, AbilityConstant } from '@kit.AbilityKit';export default class MyAbilityStage extends AbilityStage {onMemoryLevel(level: AbilityConstant.MemoryLevel): void {// 💥 这里赶紧释放非关键资源!// 比如:清缓存/关后台任务/卸载组件}
}

💎 举个栗子:
当用户切换多任务时触发该回调,及时释放图片缓存等占内存大户~


⚡️ 总结速查表

操作注意要点
创建AbilityStage手动建文件+继承类
声明入口module.json5中写对srcEntry路径
内存紧急处理onMemoryLevel()里做资源回收
特殊启动模式onAcceptWant()只在specified模式生效

🚀 UIAbility启动模式三剑客

应用不同场景,系统给你三种选择:
1️⃣ ​​singleton​​(单实例模式)→ 全家共用1个实例
2️⃣ ​​multiton​​(多实例模式)→ 每次新建1个实例
3️⃣ ​​specified​​(指定实例模式)→ 自由控制实例匹配

⚠️ 冷知识:
multiton原名standard,效果完全一样,代码里看到别懵!


🎯 1. 单实例模式(singleton)

适用场景:全局只允许存在1个的应用(如设置页)
​默认效果​​:

  • 无论调用多少次startAbility()
  • 系统中永远只有唯一UIAbility实例
  • 任务栏中也只显示1个!
graph LR
A[调用startAbility] --> B{实例存在?}
B --✅存在--> C[复用原实例] --> D[触发onNewWant回调]
B --❌不存在--> E[创建新实例] 
🛠️ 配置方法(module.json5)
{"abilities": [{"launchType": "singleton" //✨ 加上这行!}]
}

🧩 2. 多实例模式(multiton)

适用场景:每次都要新建的页面(如新建文档/聊天)
​效果​​:

  • 每次startAbility()创建全新实例
  • 任务栏可显示多个相同Ability
    figures/multiton-mode-demo.png
🛠️ 配置方法
{"abilities": [{"launchType": "multiton" //💥 改这里!}]
}

🔍 3. 指定实例模式(specified)

适用场景:既要新建实例又要复用实例(如文档类应用)
​核心原理​​:

sequenceDiagram
调用方->>AbilityStage: startAbility(带Key参数)
AbilityStage->>系统: onAcceptWant()返回匹配Key
系统->>UIAbility: { 匹配成功?复用 : 新建 }
🛠️ 配置四步走:

STEP 1️⃣ 声明specified模式

{"abilities": [{"launchType": "specified" //🎯 必改!}]
}

STEP 2️⃣ 调用时传入唯一Key

// 启动时携带自定义Key(如文档路径)
context.startAbility({bundleName: 'com.example.app',parameters: { instanceKey: '文档A路径' } //📍 关键标识!
})

STEP 3️⃣ AbilityStage中设置匹配规则

export default class MyAbilityStage extends AbilityStage {onAcceptWant(want: Want): string {// 🧩 根据传入Key返回匹配标识return `UIAbility_${want.parameters.instanceKey}`;}
}

STEP 4️⃣ 系统自动执行:

匹配结果系统行为生命周期
✅ Key匹配复用原有UIAbility实例触发onNewWant()
❌ 无匹配创建新UIAbility实例触发**onCreate()**等回调

📚 场景案例:文档应用

▶️ 打开新文档A → 新建UIAbility实例1(Key=文档A路径)  
▶️ 关闭文档A后重新打开 → 新建实例2(原实例已销毁)  
▶️ 再打开文档B → 新建实例3(Key=文档B路径)  
▶️ 再次打开文档A → **复用实例2**(Key匹配成功!)

💎 三种模式速查表

模式配置文件实例数量典型场景生命周期变化
singletonlaunchType: singleton1个设置页/用户中心复用→只触发onNewWant
multitonlaunchType: multiton多个新建文档/聊天窗口每次新建触发完整生命周期
specifiedlaunchType: specified动态控制文档复用/特定实例重开匹配成功→只触发onNewWant

⚡️ 操作口诀

要复用 → singleton  
总要新 → multiton  
灵活控 → specified + Key匹配

搞定!现在连文档小白都能秒懂启动模式啦 🎉以下是根据您需求全面优化的文本,保留所有技术细节但采用活泼口语化风格,融入表情符号、分段标题和总结表格:


🚀 UIAbility启动全攻略

一句话科普:
UIAbility是系统调度的最小单元!应用内跳转、跨应用启动(比如调支付)都靠它~


📦 基础启动三步走

场景:从EntryAbility启动FuncAbility

graph LR
A[EntryAbility] --携带参数--> B((startAbility)) --> C[FuncAbility]
🛠️ 调用方代码示例
@Entry
@Component
struct Page_UIAbilityComponentsInteractive {private context = getContext(this) as common.UIAbilityContext;build() {Column() {Button('启动FuncAbility').onClick(() => {// 🧩 关键参数配置let wantInfo: Want = {bundleName: 'com.example.app', abilityName: 'FuncAbilityA',parameters: { info: '传递的数据' } // 自定义参数};// ✨ 核心启动方法this.context.startAbility(wantInfo).then(() => {console.log('启动成功!');}).catch((error) => {console.error('启动失败:', error);});})}}
}
📥 接收方获取数据
// FuncAbilityA.ts
export default class FuncAbilityA extends UIAbility {onCreate(want: Want) {// 💡 获取传递的参数const receivedData = want.parameters?.info;console.log('收到数据:', receivedData); }
}

🔄 带返回结果的启动(超实用!)

场景:启动登录UIAbility后获取登录结果

📤 调用方发送请求 + 接收结果
// EntryAbility中
Button('登录并获取结果').onClick(() => {const RESULT_CODE = 1001; // 约定好的结果码const context = getContext(this) as common.UIAbilityContext;context.startAbilityForResult({bundleName: 'com.example.app',abilityName: 'LoginAbility'}).then((data) => {// ✅ 结果匹配校验if (data?.resultCode === RESULT_CODE) {const token = data.want?.parameters?.token;console.log('登录凭证:', token);}})})
📥 目标方返回结果
// LoginAbility中
Button('完成登录').onClick(() => {const RESULT_CODE = 1001;const context = getContext(this) as common.UIAbilityContext;// ✨ 核心返回方法context.terminateSelfWithResult({resultCode: RESULT_CODE,want: { parameters: { token: '用户Token' } }})})

🎯 精准启动指定页面

⚡️ 两种启动场景对比表
启动类型特点生命周期触发
冷启动 ❄️UIAbility完全关闭onCreateonWindowStageCreate
热启动 🔥UIAbility已在后台运行直接触发onNewWant

📌 场景1:冷启动指定页面

调用方传递标识

context.startAbility({bundleName: 'com.example.app',abilityName: 'NewsAbility',parameters: { router: 'sports' } // 🎯 页面标识
})

接收方处理逻辑

// NewsAbility.ts
export default class NewsAbility extends UIAbility {funcAbilityWant: Want | undefined;onCreate(want: Want) {this.funcAbilityWant = want; // 暂存参数}onWindowStageCreate(windowStage) {// 🧭 根据标识跳转不同页面let targetPage = 'pages/Index';if (this.funcAbilityWant?.parameters?.router === 'sports') {targetPage = 'pages/SportsNews';}windowStage.loadContent(targetPage);}
}

📌 场景2:热启动指定页面(已运行实例)

关键:UIContext动态跳转

// NewsAbility.ts中
uiContext: UIContext | undefined; // 声明UI上下文onWindowStageCreate(windowStage) {windowStage.getMainWindow((err, window) => {this.uiContext = window.getUIContext(); // 🔑 获取上下文})
}onNewWant(want: Want) {// 🔥 热启动时触发if (want.parameters?.router === 'tech') {this.uiContext?.getRouter().pushUrl({ url: 'pages/TechNews' });}
}

生活化案例 📱:
短信应用在后台时,从联系人页点击"发短信"→
直接唤醒短信应用并跳转到聊天页!


🧹 优雅关闭的两种姿势

方法效果代码示例
terminateSelf()关闭当前实例(保留快照)context.terminateSelf()
terminateSelfWithResult()关闭+返回结果见上方案例
killAllProcesses()关闭所有UIAbility实例应用上下文调用

💎 核心要点速记表

场景核心API注意要点
基础启动startAbility()用Want传递参数
带返回值启动startAbilityForResult()需约定结果码(resultCode)
冷启动指定页面windowStage.loadContent()在onWindowStageCreate处理
热启动指定页面uiContext.getRouter()需提前获取UIContext
关闭当前实例terminateSelf()默认保留最近任务列表快照

⚡️ 避坑指南

1️⃣ 跨模块启动记得配 moduleName:"moduleName": "news"
2️⃣ 热启动需在 onWindowStageCreate 中提前缓存 UIContext
3️⃣ 返回结果时 resultCode 必须前后一致!
4️⃣ 多实例模式(multiton)下每次都会创建新实例

相关文章:

  • C++之前向声明
  • [学习] Costas环详解:从原理到实战
  • 2025GEO供应商排名深度解析:源易信息构建AI生态优势
  • 一数一源一标准的补充
  • 【C】 USB CDC、Bulk-OUT 端点
  • PostgresSQL日常维护
  • 网页组件强制设置右对齐
  • python下载与开发环境配置
  • 从“字对字“到“意对意“:AI翻译正在重塑人类的语言认知模式
  • 观测云,全球领先的监控观测平台亮相亚马逊云科技中国峰会!
  • SecureRandom.getInstanceStrong() 与虚拟机的爱恨情仇
  • 【更新】中国经济政策不确定性指数数据集(2000.1-2025.5)
  • 2025 年二级造价工程师职业资格考试的报考条件有哪些新变化?
  • 【Java】Arrays.sort:TimSort
  • 560. 和为K的子数组
  • 软件测试之APP测试要点(包含Monkey基础使用)
  • C++实现文本编辑功能
  • C primer plus (第六版)第七章 编程练习第4题,第5题
  • 企业如何高效构建BI团队,解锁数据价值新高地?
  • 解锁Wi-SUN潜能!移远通信发布KCM0A5S模组,点亮智慧城市新图景
  • 专门做娱乐场所的设计网站/百度关键词点击排名
  • 如何分析一个网站做的怎么样/seo关键词快速获得排名
  • 蓝色企业网站模板/国外域名注册平台
  • 网站网商/百度中心人工电话号码
  • 教育网站制作论文/seo公司网站
  • 国家城乡和住房建设部网站首页/免费ip地址网站