本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、应用内Ability跳转
1. 使用Want显式跳转(推荐)
import common from '@ohos.app.ability.common';
// 获取当前Ability的Context
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
// 构造Want对象
let want = {
deviceId: "", // 空字符串表示本设备
bundleName: "com.example.myapp", // 当前应用包名
abilityName: "com.example.myapp.SecondAbility", // 目标Ability全名
parameters: { // 可选参数传递
key1: "value1",
key2: 100
}
};
// 启动目标Ability
context.startAbility(want).then(() => {
console.log('跳转成功');
}).catch((err) => {
console.error('跳转失败:', err.code);
});
2. 使用隐式跳转(需配置skills)
在目标Ability的module.json5中配置skills:
{
"abilities": [
{
"name": "SecondAbility",
"skills": [
{
"actions": ["action.system.detail"],
"entities": ["entity.system.default"]
}
]
}
]
}
跳转代码:
let want = {
action: "action.system.detail",
entities: ["entity.system.default"],
parameters: {
key1: "value1"
}
};
context.startAbility(want);
二、应用间Ability跳转
1. 跳转到系统Ability
let want = {
bundleName: "com.huawei.systemmanager",
abilityName: "com.huawei.systemmanager.startup.StartupAppControlActivity",
parameters: {
extra_key: "extra_value"
}
};
context.startAbility(want).catch(err => {
console.error('无法跳转:', err);
});
2. 跳转到第三方应用
let want = {
bundleName: "com.tencent.mm", // 微信包名
abilityName: "com.tencent.mm.ui.LauncherUI", // 微信主界面
parameters: {
// 微信支持的参数
scene: 1017 // 微信扫一扫场景值
}
};
context.startAbility(want);
3. 通过隐式Want跳转(推荐方式)
示例:打开网页
let want = {
action: "ohos.want.action.viewData",
uri: "https://www.example.com", // 要打开的URL
type: "text/html"
};
context.startAbility(want);
三、参数传递与接收
1. 发送参数
let want = {
bundleName: "com.example.myapp",
abilityName: "DetailAbility",
parameters: {
id: 123,
title: "商品详情",
data: JSON.stringify({price: 99.9, stock: 100})
}
};
2. 接收参数
在目标Ability的onCreate中接收:
import UIAbility from '@ohos.app.ability.UIAbility';
export default class DetailAbility extends UIAbility {
onCreate(want, launchParam) {
console.log('接收到的参数:', want.parameters);
// {id: 123, title: "商品详情", data: "{\"price\":99.9,\"stock\":100}"}
const productData = JSON.parse(want.parameters.data);
}
}
四、常见系统Ability跳转示例
1. 拨打电话
let want = {
action: "ohos.want.action.dial",
uri: "tel:10086"
};
context.startAbility(want);
2. 打开地图
let want = {
bundleName: "com.huawei.maps",
abilityName: "com.huawei.maps.MapsAbility",
parameters: {
latitude: 39.90923,
longitude: 116.397428
}
};
3. 打开系统设置
let want = {
bundleName: "com.huawei.systemmanager",
abilityName: "com.huawei.systemmanager.startup.StartupAppControlActivity"
};
五、注意事项
-
权限控制:
- 跳转系统Ability需要声明相应权限
- 跨应用跳转可能需要申请
ohos.permission.START_ABILITIES_FROM_BACKGROUND
-
错误处理:
context.startAbility(want).catch((err) => {
if (err.code === 201) {
console.error('目标Ability不存在');
} else if (err.code === 202) {
console.error('无权限访问');
}
});
3. 兼容性检查
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
let atManager = abilityAccessCtrl.createAtManager();
atManager.verifyAccessToken('ohos.permission.START_ABILITIES_FROM_BACKGROUND')
.then((result) => {
if (result === 0) {
// 有权限
}
});
4. 返回结果(使用startAbilityForResult)
context.startAbilityForResult(want).then((data) => {
console.log('返回结果:', data.resultCode, data.want?.parameters);
});