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

HarmonyOS 应用拉起系列(一):应用与元服务互通方式

HarmonyOS 5 应用拉起系列(一):应用与元服务互通方式

随着 HarmonyOS 生态的发展,应用之间、应用与元服务之间的互相拉起成为常见的交互方式。结合我平时开发所遇到的场景,将系统总结 HarmonyOS 中几种主流的拉起方式,包括 openLinkstartAbilityopenAtomicServiceFullScreenLaunchComponent,并通过实际代码进行说明,帮助开发者灵活选择、快速集成。

一、HarmonyOS 常见拉起方式对比

下表概览了各类拉起方式的特性、适用场景与限制,方便快速查阅与选型:

拉起方式描述典型用途适用场景参数要求特点与限制
openLink使用 URL Scheme 唤起目标应用三方跳转、H5 打开 App适用于已注册 URI 的目标服务需注册 scheme,例如 myapp://page?param=x通用性强,依赖目标注册 URI,不能确保一定成功
startAbility显式或隐式 Want 启动指定 UIAbility跨应用模块调用、能力联动应用内跳转、已知 bundleName 的组件跳转需指定 bundleNameabilityNameaction功能强大,多用于深度集成,适合系统内交互
openAtomicService拉起免安装元服务(原子服务)快速使用外部工具/服务一键唤起如扫码、识图、剪辑等元服务设置 actionserviceIdentityappId支持免安装,需注册为原子服务,调用链受限
FullScreenLaunchComponent以全屏方式嵌入式启动目标元服务沉浸式嵌入服务元服务间联动,如地图内嵌房产展示需配置 FullScreenLaunchComponent 权限仅元服务可用,适配复杂、须授权,鸿蒙6前存在兼容性问题

二、各拉起方式使用说明与示例

1. 使用 openLink 拉起三方应用(如支付宝)

适用于:已注册 URI scheme 的应用,常见于推广唤端、H5 页面跳转

使用说明:

  • 支持通过 link 字段传入标准 URL,系统基于隐式 want 匹配规则唤起目标应用。
  • 目标应用需声明特定的 actionentities

文档参考:
UIExtensionContext.openLink

代码示例:

openLink(link: string, context?: common.UIAbilityContext) {let contextP = context ?? getContext() as common.UIAbilityContext;let scheme = link.replace('scheme://', '');let options: OpenLinkOptions = {appLinkingOnly: false,parameters: { demo_key: 'demo_value' }};try {contextP.openLink(scheme, options, (err, result) => {if (err) {LogUtil.e(Tag, `openLink failed: ${JSON.stringify(err)}`);} else {LogUtil.i(Tag, `openLink result: ${JSON.stringify(result?.resultCode)}`);}});} catch (err) {let { code, message } = err as BusinessError;LogUtil.e(Tag, `Exception`, 'code', code, 'message', message);}
}// 示例调用
Button('拉起支付宝').onClick(() => {new OpenMethod().openLink('alipays://platformapi/startapp');
});

2. 使用 startAbility 显式拉起鸿蒙应用或元服务

适用于:已知目标包名的应用或元服务,适合系统内联动、插件调用等场景

文档参考:
UIAbilityContext.startAbility

代码示例:

async startAbility(bundleName: string, abilityName = 'EntryAbility', context?: common.UIAbilityContext) {const contextP = context ?? getContext() as common.UIAbilityContext;const want: Want = {deviceId: '',bundleName,abilityName};try {await contextP.startAbility(want);} catch (err) {if (err['code'] === 16000001) {// 应用未安装,拉起应用市场const fallbackWant: Want = {action: 'ohos.want.action.appdetail',uri: `store://appgallery.huawei.com/app/detail?id=${bundleName}`,};contextP.startAbility(fallbackWant).catch((err: BusinessError) => {LogUtil.e(Tag, `Fallback failed. Code: ${err.code}, Message: ${err.message}`);});}}
}// 示例调用
Button('拉起支付宝 (startAbility)').onClick(() => {new OpenMethod().startAbility('com.alipay.mobile.client');
});Button('拉起学习通元服务').onClick(() => {new OpenMethod().startAbility('com.atomicservice.5765880207855627899');
});

3. 使用 openAtomicService 快速拉起原子服务(免安装)

适用于:快速使用元服务,如Grab打车、学习通学习、笔记整理等

文档参考:
UIExtensionContext.openAtomicService

代码示例:

openAtomicService(appId: string, parameters?: Record<string, Object>, context?: common.UIAbilityContext) {const contextP = context ?? getContext() as common.UIAbilityContext;const options: AtomicServiceOptions = {displayId: 0,parameters};contextP.openAtomicService(appId, options).then(() => {LogUtil.d(Tag, 'openAtomicService success');}).catch((err: BusinessError) => {LogUtil.e(Tag, `openAtomicService failed: ${err.code}, ${err.message}`);});
}// 示例调用
Button('拉起学习通 (openAtomicService)').onClick(() => {new OpenMethod().openAtomicService('5765880207855627899');
});

4. 使用 FullScreenLaunchComponent 实现嵌入式拉起(沉浸式)

适用于:被拉起方授权后,在调用方中嵌入式运行元服务(如花瓣地图打开安居客)

注意事项:

  • 调试阶段需要开启开发者模式下的元服务豁免设置。
  • 需目标服务支持 ArkTS FullScreenLaunchComponent 接入,主动的进行一定的适配。
  • HarmonyOS 6 之前兼容性较差。

文档参考:
FullScreenLaunchComponent

代码示例:

@Builder
export function AtomicService() {Column() {Image($r("app.media.startIcon")).width('36vp').height('36vp')Text('嵌入式打开元服务').fontSize(10)}
}FullScreenLaunchComponent({content: AtomicService,appId: '5765880207855627899',options: {parameters: { jumpAction: 'someAction' }}
});

三、使用建议与总结

目标建议使用方式
打开三方 App(如微信、支付宝)openLink
拉起应用或元服务(本地已安装)startAbility
快速使用免安装元服务openAtomicService
沉浸式嵌入元服务(需授权)FullScreenLaunchComponent

HarmonyOS 提供了丰富的拉起能力,应根据目标组件的安装状态、是否为元服务、是否授权、是否需沉浸式交互等因素,合理选择最合适的拉起方式。希望这篇文章对你在实际开发中的接入与排查有所帮助!

后面也将继续为大家分享这几种拉起方式在实际中的应用场景,如果需要后续支持「参数传递方式」、「拉起失败兜底策略」、「应用市场跳转兼容性」等更深入的内容,欢迎留言交流!

http://www.dtcms.com/a/310398.html

相关文章:

  • 哔哩哔哩Android视频编辑页的架构升级
  • 二进制数本身没有默认的有符号或无符号解释
  • Eden 和 Survivor 比例可以调整么,参数是什么?还用到了哪些参数?
  • 数新智能 CTO 原攀峰:DataCyber 面向 AI 时代的多模态数据湖设计与实践
  • MYSQL:JDBC编程
  • C语言笔记4:错题整理
  • QT开发---图形与图像(补充)
  • ZYNQ与MPSoC实战:从Vitis入门到项目开发
  • Java学习-运算符
  • HRM论文解读
  • Windows安装虚拟机遇到内容解码失败
  • 【Django】-2- 处理HTTP请求
  • HTTP客户端实现:深入理解Go的net/http包
  • Vue3 + Vite 项目中 API 代理配置问题分析与解决
  • 如何处理Y2K38问题
  • 驾驶场景安全带识别误检率↓76%:陌讯动态特征聚合算法实战解析
  • 【深度学习①】 | Numpy数组篇
  • 【从0开始学习Java | 第12篇】内部类
  • C语言:冒泡排序
  • VUE:学习路径
  • 机器学习:开启智能时代的钥匙
  • 前端学习日记(十七)
  • Unity3D制作UI动画效果
  • treeshaking,webpack,vite
  • 技术为核,口碑为盾:普瑞眼科成都市场“卷王”地位的形成逻辑
  • Canny边缘检测算法-个人记录
  • 计数组合学7.10(舒尔函数的组合定义)
  • 图片搜索1688的商品技术实现:API接口item_search_img
  • 嵌入式——C语言:俄罗斯方块
  • C#常见的转义字符