应用间跳转
应用间跳转
DxinApp : 拉起方(源应用)计划拉起指定应用鸿蒙学苑
在无目标应用时
startAbility隐式启动其他应用
在源目标应用中Index.ets中声明context并通过startAbility隐式启动目标应用。真机运行会弹窗提示暂无可用打开方式(模拟器无弹窗)。
如果不想弹窗(真机)。可在Want对象中配置flags为wantConstant.Flags.FLAG_START_WITHOUT_TIPS,取消弹窗提示暂无可用打开方式。

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

配置目标应用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页面布局

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

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)
}