跳到主要内容

应用间跳转

应用间跳转

DxinApp : 拉起方(源应用)计划拉起指定应用鸿蒙学苑


在无目标应用时

startAbility隐式启动其他应用

在源目标应用中Index.ets中声明context并通过startAbility隐式启动目标应用。真机运行会弹窗提示暂无可用打开方式(模拟器无弹窗)。

如果不想弹窗(真机)。可在Want对象中配置flags为wantConstant.Flags.FLAG_START_WITHOUT_TIPS,取消弹窗提示暂无可用打开方式。

image-20251111232034948

import { common, Want } from '@kit.AbilityKit';

@Entry
@Component
struct Index {
// 准备context对象
context = this.getUIContext().getHostContext() as common.UIAbilityContext;

build() {
Column({ space: 30 }) {
Text("应用间跳转案例").fontSize(30)
Divider().color(Color.Red)
Button('startAbility隐式启动其他应用:无指定应用')
.onClick(() => {
// context为UIAbility对象的成员
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
action: 'https://www.dxin.com/hmxy', // 隐式启动 与待匹配应用组件的skills配置中的actions进行匹配。
// flags: wantConstant.Flags.FLAG_START_WITHOUT_TIPS, // 可取消暂无可用打开方式的弹窗
};
// context为调用方UIAbility的UIAbilityContext
this.context.startAbility(wantInfo).then(() => {
console.log(`dxin => 隐式启动成功success`)
}).catch(() => {
console.log(`dxin => 隐式启动失败err`)
});
})
}
.width('100%')
.height('100%')
.backgroundColor($r('app.color.theme_color'))
}
}

openLink方式启动其他应用

当前暂不支持取消弹框提示。相关能力官方已纳入需求规划,说是要我持续关注。

拉起方应用通过UIAbilityContext.openLink()接口,传入目标应用的链接,拉起目标应用。

openLink接口提供了两种拉起目标应用的方式,开发者可根据业务需求进行选择。

  • 方式一: 仅以App Linking的方式打开应用。

    将appLinkingOnly参数设为true,若有App Linking匹配的应用,则直接打开目标应用。若无App Linking匹配的应用,则抛异常给开发者进行处理。

    适用于无法打开目标应用时,开发者做了相应的异常处理。例如:拉起方应用集成了ArkWeb,当目标应用不存在时,可通过ArkWeb打开链接。

      // appLinkingOnly指定为true 仅仅以applinking方式打开  匹配不到,开发者自行抛异常
Button('AppLinking拉起鸿蒙学苑应用+true')
.onClick(() => {
let link: string = "https://www.dxin.com/hmxy";
let Options: OpenLinkOptions = { appLinkingOnly: true }
this.context.openLink(link, Options)
.then(() => {
console.log(`dxin => AppLinking appLinkingOnly: true 打开成功success`);
})
.catch(() => {
console.log(`dxin => AppLinking appLinkingOnly: true 打开失败error`);
})
})
  • 方式二: 以App Linking优先的方式打开应用。

    将appLinkingOnly参数设为false或者不传,若有App Linking匹配的应用,则直接打开目标应用。若无App Linking匹配的应用,真机则尝试以浏览器打开链接的方式打开应用。(模拟器因为没有浏览器的原因,就跟死鱼一样没反应)

    适用于无法打开目标应用时,开发者未做任何处理。此时目标应用不存在时,会通过系统浏览器打开链接。

      Button('openLink拉起鸿蒙学苑应用+false')
.onClick(() => {
let link: string = "https://www.dxin.com/hmxy";
let Options: OpenLinkOptions = { appLinkingOnly: false }
this.context.openLink(link, Options)
})

有目标应用时

创建目标应用HMXY

image-20251111233215825

配置目标应用HMXY的module.json5。(追加skills配置项内容)

  "skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"ohos.want.action.home"
]
},
{
"entities": [
"entity.system.browsable"
],
"actions": [
"ohos.want.action.viewData"
],
"uris": [
{
"scheme": "https",
"host": "www.dxin.com",
"path": "hmxy"
}
]
}
]

重新运行源应用测试拉起效果:

appLinkingOnly参数设为false或者不传,会退化为DeepLink方式寻找应用,可以拉起目标应用。

appLinkingOnly参数设为true,表示仅以AppLinking的方式拉起,此时尽管目标应用已经安装存在,但是依旧无法拉起。因为如果要满足AppLinking,需要在AGC开通App Linking服务-->在开发者网站上关联应用-->在AGC创建关联的网址域名-->在module.json5中配置关联的网址域名。我特么去哪给你弄个网站并关联应用啊。

而恰好我有个网站鸿蒙学苑,我按照官方研究了两个小时,对自己的网站也配置了。结果依旧无法验证。GG。


应用内Ability跳转

Railway应用内拉起UIAbility

1. Index页面布局

image-20250922223931539

import { common, OpenLinkOptions, Want } from '@kit.AbilityKit'

@Entry
@Component
struct Index {
context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;

build() {
Column({ space: 30 }) {
Image($r('app.media.china_railway'))
.width('20%')
Text("12306订票页面").fontSize(30)
// 启动应用内的 UIAbility;
Button('拉起订单模块')
.onClick(() => {
//this.startOrderAbility()
})
// 启动第三方软件
Button("拉起支付宝付款")
.backgroundColor('#06B4FD')
.onClick(() => {
//这个是为了验证应用间跳转提前准备的UI按钮。在本文中用不上了。
})
}
.width('100%')
.height('100%')
}
}

2. 新建OrderAbility配置启动页Order.ets

image-20250922224004970

import { common } from '@kit.AbilityKit';

@Entry
@Component
struct Order {
context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;

build() {
Column({ space: 30 }) {
Image($r('app.media.order'))
.width('20%')
Text("12306订单页面").fontSize(30)

Button('停止订单页-返回首页')
.onClick(() => {
// TODO Order.ets 待完成: 返回首页
})
}
.width('100%')
.height('100%')
}
}

3. 配置OrderAbility启动页及图标

  onWindowStageCreate(windowStage: window.WindowStage): void {
windowStage.loadContent('pages/Order', (err) => {});
}
 {
"name": "OrderAbility",
"srcEntry": "./ets/orderability/OrderAbility.ets",
"description": "$string:OrderAbility_desc",
"icon": "$media:order",
"label": "$string:OrderAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background"
}

4.拉起订单OrderAbility

  // 拉起 订单模块
startOrderAbility() {
// 需要want对象 说清楚目标是谁
let wantInfo: Want = {
deviceId: '', // 本设备
bundleName: this.context.applicationInfo.name, //可动态获取
moduleName: '', // 目标 模块目录名称 entry 默认同模块
abilityName: 'OrderAbility'
}
this.context.startAbility(wantInfo)
}
加载中...