开天辟地 HarmonyOS(鸿蒙) - 跨进程通信: Want

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

开天辟地 HarmonyOS(鸿蒙) - 跨进程通信: Want

示例如下:

pages\ipc\WantDemo.ets

/*
 * Want - 用于应用间跳转
 */

import { TitleBar } from '../TitleBar';
import { BusinessError } from '@kit.BasicServicesKit';
import { common, Want } from '@kit.AbilityKit';
import { Helper } from '../../utils/Helper';

@Entry
@Component
struct WantDemo {

  build() {
    Column() {
      TitleBar()
      Tabs() {
        TabContent() { MySample1() }.tabBar('打开指定的 app').align(Alignment.Top)
        TabContent() { MySample2() }.tabBar('打开设置页').align(Alignment.Top)
      }
      .scrollable(true)
      .barMode(BarMode.Scrollable)
      .layoutWeight(1)
    }
  }
}

@Component
struct MySample1 {

  @State message: string = ""

  build() {
    Column({space:10}) {

      Text(this.message)

      /*
       * UIAbilityContext
       *   startAbility() - 拉起指定 want 的 ability
       *   startAbilityForResult() - 拉起指定 want 的 ability 并获取返回结果(参见 /basic/UIAbilityDemo.ets 中的相关说明)
       *
       * Want - 需要拉起的 ability 的相关信息
       *   bundleName - bundle 的名称
       *   moduleName - module 的名称
       *   abilityName - ability 的名称
       *   parameters - 传参,目标 app 可以从 want 中获取
       *
       * 注:本例演示的目标应用请参见 harmonydemo2 项目
       */
      Button('通过 want 拉起 ability 的方式 1').onClick(() => {
        let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
        let want: Want = {
          bundleName: 'com.webabcd.harmonydemo2',
          abilityName: 'com.webabcd.harmonydemo2.EntryAbility',
          parameters: { // 传参
            'k1': 'v1',
            'k2': `${Helper.getTimestampString()}`,
          }
        };
        context.startAbility(want).then(() => {
          this.message = 'startAbility 成功';
        }).catch((err: BusinessError) => {
          this.message = `startAbility 失败 errCode:${err.code}, errMessage:${err.message}`;
        });
      })

      /*
       * UIAbilityContext
       *   startAbility() - 拉起指定 want 的 ability
       *
       * Want - 需要拉起的 ability 的相关信息
       *   uri - deep linking 或 app linking 地址
       *   parameters - 传参,目标 app 可以从 want 中获取
       *
       * 注:关于 deep linking 请参见 DeepLinkingDemo.ets 中的说明,关于 app linking 请参见 AppLinkingDemo.ets 中的说明
       */
      Button('通过 want 拉起 app 的方式 2').onClick(() => {
        let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
        let want: Want = {
          uri: "webabcd://a.b.c/api?p1=xyz",
          parameters: { // 传参
            'k1': 'v1',
            'k2': `${Helper.getTimestampString()}`,
          }
        };
        context.startAbility(want).then(() => {
          this.message = 'startAbility 成功';
        }).catch((err: BusinessError) => {
          this.message = `startAbility 失败 errCode:${err.code}, errMessage:${err.message}`;
        });
      })
    }
  }
}

@Component
struct MySample2 {

  @State message: string = ""

  build() {
    Column({space:10}) {

      Text(this.message)

      Button("打开设置 app").onClick(() => {
        let context = getContext(this) as common.UIAbilityContext;

        // 跳转到设置 app 的 Want 对象
        let want: Want = {
          bundleName: 'com.huawei.hmos.settings', // 设置 app 的 bundleName
          abilityName: 'com.huawei.hmos.settings.MainAbility', // 设置 app 的 abilityName
        };

        context.startAbility(want).then(() => { }).catch((err: BusinessError) => { });
      })

      Button("打开设置 app 的 wifi 设置页").onClick(() => {
        let context = getContext(this) as common.UIAbilityContext;

        let want: Want = {
          /*
           * uri - 需要跳转到的系统设置页面的名称
           *   application_info_entry - 系统的设置页首页
           *   systemui_notification_settings - 系统的通知设置页
           *   wifi_entry - 系统的 wifi 设置页
           * 注:找到想要的系统设置页面的名称的方法如下
           * 1、在 HiLog 中过滤 SettingsHome 相关的日志
           * 2、打开设置 app 并进入到想要的设置页面
           * 3、比如 wifi 设置页面,则可以在日志中找到 my router: wifi_entry
           */
          uri: 'wifi_entry'
        };

        context.startAbility(want).then(() => { }).catch((err: BusinessError) => { });
      })

      Button("打开设置 app 的当前应用的设置页").onClick(() => {
        let context = getContext(this) as common.UIAbilityContext;

        // 此 Want 可以跳转到设置 app 的当前应用的设置页
        let want: Want = {
          uri: "application_info_entry", // 系统的设置页首页
          parameters: {
            pushParams: context.abilityInfo.bundleName // 当前应用的包名
          }
        };

        context.startAbility(want).then(() => { }).catch((err: BusinessError) => { });
      })
    }
  }
}

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

posted @ 2025-04-15 09:46  webabcd  阅读(100)  评论(0)    收藏  举报