HarmonyOS的连接艺术之二:精准控制目标应用 原创
本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。
在某些场景下,我们希望应用能够精准控制目标应用,例如打开地图应用查看特定地点,或者打开音乐 App 播放特定歌曲。HarmonyOS 提供了多种方式来实现这种类型的跳转,例如 openLink 接口、startAbility 接口和 Web 组件跳转等。
指定应用链接跳转
1. openLink 接口
openLink
接口是最常用的跳转方式,它可以将用户引导到目标应用的特定页面。例如,你可以在购物 App 中点击“查看地图”按钮,然后系统就会自动打开地图 App 并跳转到店铺位置。
openLink 接口参数说明
参数 | 类型 | 说明 |
---|---|---|
link | string | 目标应用的 URL 链接 |
options | object | 选项参数,例如 appLinkingOnly、parameters 等 |
示例代码: |
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const link: string = "geo:37.7749,-122.4194"; // 地点坐标
const options: common.OpenLinkOptions = {
appLinkingOnly: false // 允许使用 Deep Linking 跳转
};
context.openLink(link, options);
}
}
2. startAbility 接口
startAbility
接口与 openLink
接口类似,但它提供了更多的选项参数,例如 abilityName
和 moduleName
等,可以指定目标应用的 Ability 名称和模块名称。
startAbility 接口参数说明
参数 | 类型 | 说明 |
---|---|---|
want | common.Want | 目标应用的 Want 对象,包含 action、uri、entities、actions、parameters 和 flags 等信息 |
options | object | 选项参数,例如 abilityName、moduleName 等 |
示例代码: |
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const want: common.Want = {
action: 'ohos.want.action.viewData',
uri: "geo:37.7749,-122.4194",
entities: ["entity.system.browsable"],
actions: ["ohos.want.action.viewData"]
};
context.startAbility(want);
}
}
3. Web 组件跳转
Web 组件可以通过拦截 onLoadIntercept
回调来处理 Deep Linking 链接,实现应用跳转。
示例代码:
import { webview } from '@ohos.arkweb';
export default class WebComponent {
controller: webview.WebviewController = new webview.WebviewController();
build() {
this.controller.onLoadIntercept((event) => {
const url: string = event.data.getRequestUrl();
if (url.startsWith("geo:")) {
// 跳转到地图应用
}
return true; // 阻止页面加载
});
}
}
4. 指定 Ability 跳转 (API 11 及以前版本)
在 API 11 及以前版本,可以使用显式 Want 拉起其他应用,但这种方式在 API 12 及以上版本已不再支持。
示例代码:
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const want: common.Want = {
bundleName: "com.example.demo",
moduleName: "entry",
abilityName: "EntryAbility"
};
context.startAbility(want);
}
}
举(N)个栗子
示例 1:使用 openLink 接口打开浏览器
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const link: string = "https://www.example.com";
const options: common.OpenLinkOptions = {
appLinkingOnly: false // 允许使用 Deep Linking 跳转
};
context.openLink(link, options);
}
}
示例 2:使用 startAbility 接口打开计算器应用
import { common } from '@ohos.app.ability.common';
export default class EntryAbility extends common.UIAbility {
onWindowStageCreate(windowStage: common.WindowStage) {
const context = this.getContext(this) as common.UIAbilityContext;
const want: common.Want = {
action: 'ohos.want.action.viewData',
uri: "calculator",
entities: ["entity.system.browsable"],
actions: ["ohos.want.action.viewData"]
};
context.startAbility(want);
}
}
示例 3:使用 Web 组件打开天气应用
import { webview } from '@ohos.arkweb';
export default class WebComponent {
controller: webview.WebviewController = new webview.WebviewController();
build() {
this.controller.onLoadIntercept((event) => {
const url: string = event.data.getRequestUrl();
if (url.startsWith("weather:")) {
// 跳转到天气应用
}
return true; // 阻止页面加载
});
}
}
总结:
拉起指定应用是应用间跳转的重要方式,它能够精准控制目标应用,实现特定的功能,实际开发中可以根据实际需求选择合适的跳转方式。