前言:为什么你需要关注意图框架?

回想一下,上次你打开一个 App 只为了看一个信息:电影票座位、快递物流、航班动态……结果被迫经历了启动页、广告弹窗、首页推荐、层层菜单,最后才找到想要的内容。

如果下次你只需要对小艺说出你的需求,你的 App 就能直接从系统层拉起目标页面,用户会不会更喜欢用你的应用?

就像以下动图中展示的那样:查天气、买电影票、设闹钟,都能对小艺一句话实现。你的 App 功能,同样可以拥有这种体验。这不是产品愿景,而是鸿蒙意图框架此刻就能提供的接入能力。

图片

图片

图片

意图框架(Insight-Intent)是鸿蒙生态中连接应用与系统级 AI 入口的关键桥梁。通过它,你可以将 App 的核心功能封装成标准化「意图」,让小艺语音、小艺建议等系统入口能够智能识别并直接调用——用户一句话,你的功能即刻响应。

目前鸿蒙意图框架已覆盖影音娱乐、出行导航、便捷生活、金融理财、健康医疗等十余个垂域,开放了上百种标准可接入能力,例如播放音视频、骑行/驾车导航、查快递缴话费、查社保公积金、股票基金交易、医院挂号等常见场景,开发者既可接入官方预置标准意图,也可自定义专属业务意图。官方标准意图垂域与能力清单可查阅:标准意图接入规范 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/insight-intent-access-specifications

本文用最通俗的语言讲透基础概念,再手把手带你 5 分钟完成首个意图 Demo。

一、意图框架基础概念

1. 什么是意图框架

意图框架是鸿蒙提供的应用功能开放框架,让 App 的核心能力能够被小艺等系统入口直接调用,实现「一句话直达」的智能体验。

简单举例:

传统方式:用户想买电影票 → 打开你的 App → 找到电影模块 → 选影片 → 选场次 → 确认购买(5 步操作)

意图框架方式:用户对小艺说「帮我买《给阿嬷的情书》今晚7点半的电影票」→ 小艺识别意图 → 直接拉起你的 App 购票页面,并自动填充影片、场次信息→ 用户只需确认支付(2 步完成)

2. 核心基础名词(新手必懂)

名词 一句话解释 举例
意图 功能执行的最小单元 购买电影票查看电影票播放音乐
意图参数 系统从用户语音或文字中提取并传给 App 的数据 {movieName: "给阿嬷的情书", time: "19:30"}
意图执行结果 App 执行后返回给系统的反馈 {success: true, orderId: "NO20260520001", seatNumber: "4排9座"}

3. 运行机制极简拆解

意图开发:开发者基于 App 业务功能,通过配置文件或装饰器,定义意图、参数和执行逻辑。

意图查询:系统入口可以查询注册到意图框架的意图及其功能。

意图执行:系统入口解析用户自然语言或操作指令,匹配对应意图,传递参数给 App,App 执行对应功能后将执行结果回传给系统,系统将结果反馈给用户。

意图运行机制

4. 两种开发方式对比

意图框架提供两种开发方式,新手优先推荐装饰器开发:

开发方式 适配版本 核心特点 适用场景
通过配置文件开发 API 11 及以上 需新建配置文件+执行文件,绑定 Ability 组件 适用于接入意图框架预定义意图,复杂业务定制
通过装饰器开发(推荐) API 20 及以上(鸿蒙 6.0+) 代码注解快速定义,复用现有功能,无需额外配置文件 新手入门、已实现的功能快速接入意图框架

二、意图框架接入 Demo(5 分钟上手)

前置准备

开发环境:DevEco Studio,适配API 20(鸿蒙 6.0 及以上);

设备:鸿蒙6.0及以上版本手机;

开发方式:通过装饰器开发,无需额外配置文件,极简实现。

Demo 目标

实现一个拉起 App 订票页面意图:通过系统意图调试工具触发,自动拉起 App 的订票页面,新手快速验证意图调用能力。

步骤 1:创建鸿蒙工程

新建Empty Ability工程,API 版本选择API 20及以上版本,等待工程同步完成。

图片

步骤 2:创建订票信息页面

新建 entry/src/main/ets/pages/BookingInfoPage.ets,添加页面信息:

@Entry
@Component
struct BookingInfoPage {
  @State orderNumber: string = 'NO20260520001';
  @State movieName: string = '给阿嬷的情书';
  @State cinema: string = '嘉年华影城(滨江店)';
  @State showTime: string = '2026年5月20日 19:30';
  @State seatInfo: string = '4排9座';
  @State status: string = '已出票';

  build() {
    Column() {
      // 标题栏
      Row() {
        Text('🎬 订票信息')
          .fontSize(24)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
      .margin({ top: 30, bottom: 20 })
      .justifyContent(FlexAlign.Center)

      // 订单卡片
      Column() {
        Text(`订单号:${this.orderNumber}`)
          .fontSize(16)
          .fontColor('#666666')
          .margin({ bottom: 15 })

        Divider()

        Row() {
          Text('🎞️ 影片:')
            .fontSize(16)
          Text(this.movieName)
            .fontSize(16)
            .fontWeight(FontWeight.Medium)
        }
        .width('100%')
        .margin({ top: 12 })

        Row() {
          Text('🏢 影院:')
            .fontSize(16)
          Text(this.cinema)
            .fontSize(16)
        }
        .width('100%')
        .margin({ top: 8 })

        Row() {
          Text('⏰ 场次:')
            .fontSize(16)
          Text(this.showTime)
            .fontSize(16)
        }
        .width('100%')
        .margin({ top: 8 })

        Row() {
          Text('💺 座位:')
            .fontSize(16)
          Text(this.seatInfo)
            .fontSize(16)
            .fontColor('#FF6600')
        }
        .width('100%')
        .margin({ top: 8 })

        Row() {
          Text('📌 状态:')
            .fontSize(16)
          Text(this.status)
            .fontSize(16)
            .fontColor('#00AA00')
        }
        .width('100%')
        .margin({ top: 8 })
      }
      .width('90%')
      .padding(20)
      .backgroundColor('#F5F5F5')
      .borderRadius(12)
      .margin({ top: 20 })

      // 取票码
      Column() {
        Text('取票码')
          .fontSize(14)
          .fontColor('#999999')
          .margin({ bottom: 5 })
        Text('1234 5678')
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .fontColor('#FF6600')
          .letterSpacing(4)
      }
      .width('90%')
      .padding(15)
      .backgroundColor('#FFF8E7')
      .borderRadius(8)
      .margin({ top: 20 })
      .alignItems(HorizontalAlign.Center)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }
}

图片

步骤 3:添加意图装饰器定义意图

在 BookingInfoPage 页面上添加 @InsightIntentPage 装饰器:

// 导入意图框架装饰器
import { InsightIntentPage } from '@kit.AbilityKit';
// 为订票信息页面添加意图注解——声明这是一个可被系统入口拉起的页面
@InsightIntentPage({
  intentName: 'ViewBookingInfo',        // 意图唯一标识
  domain: 'MovieTicketsDomain',        // 所属领域:电影票务
  intentVersion: '1.0.1',              // 版本号
  displayName: '查看订票信息',           // 意图显示名称
  llmDescription: '查看用户的电影票订票信息,包括影片名称、影院、场次、座位和取票码',  // 用于AI理解描述
  uiAbility: 'EntryAbility',            // 绑定的 Ability
  pagePath: './ets/pages/BookingInfoPage',  // 目标页面路径
})
@Entry
@Component
struct BookingInfoPage {
  // ... 页面代码同上
}

图片

步骤 4:开启意图调试开关&验证意图执行

4.1 App 编译安装

编译运行 App,安装至手机。

4.2 设备开启意图调试开关(仅首次需要)

打开设备的「设置」应用;

选择「系统」菜单;

选择「开发者选项」菜单;

选择「意图框架调试」菜单;

打开「意图框架调试」功能开关。

图片

4.3 验证执行意图

点击「查看设备上所有意图」,可以查看所有已注册意图;

点击「查看订票信息」意图;

点击「执行意图」;

✅ App 自动拉起,直接展示订票信息页面——成功!

图片

相关官方链接

1. 通过小艺端到端调测意图:开发者测试

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/intents-skill-all-rec-dp-self-validation

2. 意图上架指导:意图标准协议上架指导

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/intents-kit-listing-standard-protocol

3. 意图框架开发指南:意图框架开发指导

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/insight-intent

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐