Harmony os——Want 概述 & 速记小抄

114 阅读3分钟

Harmony os——Want 概述 & 速记小抄

可以把 Want 理解成: 「在组件之间传话的信封」,里面既可以写要去找谁,也可以写要干什么,还可以塞一些额外数据


1. Want 是什么?

  • 定义Want 是一个对象,用来在应用组件之间 传递信息 + 描述目标组件

  • 最典型场景:

    • startAbility(want)

      • UIAbilityA 想启动 UIAbilityB,同时带一些参数,就用 Want 当参数。

要记住两件事:

  1. Want告诉系统:我要去哪 / 找谁(目标组件信息)
  2. Want顺便带着:要带什么东西过去(parameters、uri、type 等)

2. Want 的两种类型:显式 & 隐式

2.1 显式 Want(Explicit Want)

定义:

在 Want 里明确写出 bundleName + abilityName 的叫显式 Want。

 import { Want } from '@kit.AbilityKit';
 ​
 let wantInfo: Want = {
   deviceId: '', // 为空表示本设备
   bundleName: 'com.example.myapplication',
   abilityName: 'FuncAbility',
 }

特点:

  • 目标非常明确: → 就拉起这个 App(bundleName)里的这个 Ability(abilityName)。

  • 常用于:应用内组件跳转

    • 例如:当前应用的 EntryAbility 跳自己模块里的 FuncAbility。
  • API 12 之后的注意点:

不再推荐三方应用使用「指定 Ability」的方式拉起其他应用 对于跨应用,推荐用「应用链接(App Link)」而不是显式 Want 指定 abilityName。


2.2 隐式 Want(Implicit Want)

定义:

Want 里不指定 abilityName 的叫隐式 Want。

 import { Want } from '@kit.AbilityKit';
 ​
 let wantInfo: Want = {
   // bundleName 可选,如指定只在本 bundle 内匹配就填上
   // bundleName: 'com.example.myapplication',
   action: 'ohos.want.action.search',
   entities: ['entity.system.browsable'], // 可省略
   uri: 'https://www.test.com:8080/query/student',
   type: 'text/plain',
 };

核心思路:

  • 不关心由谁来处理,只关心我要做什么事

    • action:我要做的动作(搜索 / 浏览 / 查看 等)
    • entities:实体特征(可浏览等)
    • uri:目标资源(链接、文件路径等)
    • type:MIME 类型(如 text/plain、image/png)
  • 由系统根据 skills 匹配所有能处理该请求的组件(UIAbility / ServiceExtensionAbility)。

隐式 Want 启动时的三种结果:

  1. 没有匹配到任何能处理的组件 → 启动失败。
  2. 刚好匹配一个合适的组件 → 直接启动该组件。
  3. 匹配到多个 UIAbility → 系统弹出选择框,让用户选用哪个应用处理(比如多个浏览器)。

3. 特殊说明:和 ServiceExtensionAbility 的关系

对于启动 ServiceExtensionAbility 的场景,有额外规则:

  1. 如果 Want 中 带有 abilityName

    • ❌ 不允许通过 隐式 Want 启动 ServiceExtensionAbility (因为已经变成显式了,就不能混用隐式匹配机制)
  2. 如果 Want 中 只带有 bundleName(不带 abilityName)

    • ✅ 可以用 startServiceExtensionAbility() 以「隐式 Want」方式启动

    • 系统会在该 bundle 里:

      • 找出所有符合条件的 ServiceExtensionAbility
      • 选择优先级最高的一个返回
      • 若优先级相同,返回第一个

4. 显式 vs 隐式 Want 对比表

对比项显式 Want隐式 Want
目标指定方式明确指定 bundleName + abilityName不指定 abilityName,只用 action/uri/type 等描述需求
典型用途应用内组件跳转希望由系统 / 用户选择合适应用处理某种操作
跨应用调用以前常用,现在三方应用不推荐再显式指定其他应用 Ability(API 12 之后)推荐用隐式 + 应用链接的方式
系统行为直接拉起指定的 Ability系统匹配符合 skills 的组件,可能弹出「选择应用」对话框
和 ServiceExtensionAbility带 abilityName 时不能隐式启动 ServiceExtension只带 bundleName 时可隐式启动,返回优先级最高的 ServiceExtension

5. 记忆小口诀(方便你复习)

  • 显式 Want: 👉「我清楚要找谁」→ 写死 bundleName + abilityName

  • 隐式 Want: 👉「我只说要干啥」→ 写 action / uri / type,让系统帮我找人。

  • 跨应用三方场景(API 12+) : 👉「别硬点名人家 Ability」→ 用应用链接 / 隐式 Want,让系统去匹配。

  • ServiceExtensionAbility 特例

    • 有 abilityName → 不能隐式
    • 只有 bundleName → 能隐式,系统按优先级选一个。