鸿蒙Ability跳转:应用内与应用间跳转

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、应用内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"
};

五、注意事项

  1. 权限控制

    • 跳转系统Ability需要声明相应权限
    • 跨应用跳转可能需要申请ohos.permission.START_ABILITIES_FROM_BACKGROUND
  2. 错误处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值