回想一下,上次你打開一個 App 只為了看一個信息:電影票座位、快遞物流、航班動態(tài)……結(jié)果被迫經(jīng)歷了啟動頁、廣告彈窗、首頁推薦、層層菜單,最后才找到想要的內(nèi)容。
如果下次你只需要對小藝說出你的需求,你的 App 就能直接從系統(tǒng)層拉起目標(biāo)頁面,用戶會不會更喜歡用你的應(yīng)用? 就像以下動圖中展示的那樣:查天氣、買電影票、設(shè)鬧鐘,都能對小藝一句話實現(xiàn)。你的 App 功能,同樣可以擁有這種體驗。這不是產(chǎn)品愿景,而是鴻蒙意圖框架此刻就能提供的接入能力。


一、意圖框架基礎(chǔ)概念
1. 什么是意圖框架
意圖框架是鴻蒙提供的應(yīng)用功能開放框架,讓 App 的核心能力能夠被小藝等系統(tǒng)入口直接調(diào)用,實現(xiàn)「一句話直達(dá)」的智能體驗。 簡單舉例: 傳統(tǒng)方式:用戶想買電影票 → 打開你的 App → 找到電影模塊 → 選影片 → 選場次 → 確認(rèn)購買(5 步操作) 意圖框架方式:用戶對小藝說「幫我買《給阿嬤的情書》今晚7點(diǎn)半的電影票」→ 小藝識別意圖 → 直接拉起你的 App 購票頁面,并自動填充影片、場次信息→ 用戶只需確認(rèn)支付(2 步完成)2. 核心基礎(chǔ)名詞(新手必懂)
| 名詞 | 一句話解釋 | 舉例 |
|---|---|---|
| 意圖 | 功能執(zhí)行的最小單元 |
購買電影票 、查看電影票、播放音樂 |
| 意圖參數(shù) | 系統(tǒng)從用戶語音或文字中提取并傳給 App 的數(shù)據(jù) | {movieName: "給阿嬤的情書", time: "19:30"} |
| 意圖執(zhí)行結(jié)果 | App 執(zhí)行后返回給系統(tǒng)的反饋 | {success: true, orderId: "NO20260520001", seatNumber: "4排9座"} |
3. 運(yùn)行機(jī)制極簡拆解
意圖開發(fā):開發(fā)者基于 App 業(yè)務(wù)功能,通過配置文件或裝飾器,定義意圖、參數(shù)和執(zhí)行邏輯。 意圖查詢:系統(tǒng)入口可以查詢注冊到意圖框架的意圖及其功能。 意圖執(zhí)行:系統(tǒng)入口解析用戶自然語言或操作指令,匹配對應(yīng)意圖,傳遞參數(shù)給 App,App 執(zhí)行對應(yīng)功能后將執(zhí)行結(jié)果回傳給系統(tǒng),系統(tǒng)將結(jié)果反饋給用戶。
4. 兩種開發(fā)方式對比
意圖框架提供兩種開發(fā)方式,新手優(yōu)先推薦裝飾器開發(fā):| 開發(fā)方式 | 適配版本 | 核心特點(diǎn) | 適用場景 |
|---|---|---|---|
| 通過配置文件開發(fā) | API 11 及以上 | 需新建配置文件+執(zhí)行文件,綁定 Ability 組件 | 適用于接入意圖框架預(yù)定義意圖,復(fù)雜業(yè)務(wù)定制 |
| 通過裝飾器開發(fā)(推薦) | API 20 及以上(鴻蒙 6.0+) | 代碼注解快速定義,復(fù)用現(xiàn)有功能,無需額外配置文件 | 新手入門、已實現(xiàn)的功能快速接入意圖框架 |
二、意圖框架接入 Demo(5 分鐘上手)
前置準(zhǔn)備
開發(fā)環(huán)境:DevEco Studio,適配API 20(鴻蒙 6.0 及以上); 設(shè)備:鴻蒙6.0及以上版本手機(jī); 開發(fā)方式:通過裝飾器開發(fā),無需額外配置文件,極簡實現(xiàn)。Demo 目標(biāo)
實現(xiàn)一個拉起 App 訂票頁面意圖:通過系統(tǒng)意圖調(diào)試工具觸發(fā),自動拉起 App 的訂票頁面,新手快速驗證意圖調(diào)用能力。步驟 1:創(chuàng)建鴻蒙工程
新建Empty Ability工程,API 版本選擇API 20及以上版本,等待工程同步完成。
步驟 2:創(chuàng)建訂票信息頁面
新建 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() {
? ? ??// 標(biāo)題欄
? ? ??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('?? 狀態(tài):')
? ? ? ? ? ? .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 裝飾器:// 導(dǎo)入意圖框架裝飾器
import?{?InsightIntentPage?}?from?'@kit.AbilityKit';
// 為訂票信息頁面添加意圖注解——聲明這是一個可被系統(tǒng)入口拉起的頁面
@InsightIntentPage({
??intentName:?'ViewBookingInfo', ? ? ? ?// 意圖唯一標(biāo)識
??domain:?'MovieTicketsDomain', ? ? ? ?// 所屬領(lǐng)域:電影票務(wù)
??intentVersion:?'1.0.1', ? ? ? ? ? ? ?// 版本號
??displayName:?'查看訂票信息', ? ? ? ? ??// 意圖顯示名稱
??llmDescription:?'查看用戶的電影票訂票信息,包括影片名稱、影院、場次、座位和取票碼', ?// 用于AI理解描述
??uiAbility:?'EntryAbility', ? ? ? ? ? ?// 綁定的 Ability
??pagePath:?'./ets/pages/BookingInfoPage', ?// 目標(biāo)頁面路徑
})
@Entry
@Component
struct?BookingInfoPage?{
??// ... 頁面代碼同上
} 
步驟 4:開啟意圖調(diào)試開關(guān)&驗證意圖執(zhí)行
4.1 App 編譯安裝
編譯運(yùn)行 App,安裝至手機(jī)。4.2 設(shè)備開啟意圖調(diào)試開關(guān)(僅首次需要)
打開設(shè)備的「設(shè)置」應(yīng)用; 選擇「系統(tǒng)」菜單; 選擇「開發(fā)者選項」菜單; 選擇「意圖框架調(diào)試」菜單; 打開「意圖框架調(diào)試」功能開關(guān)。
4.3 驗證執(zhí)行意圖
點(diǎn)擊「查看設(shè)備上所有意圖」,可以查看所有已注冊意圖; 點(diǎn)擊「查看訂票信息」意圖; 點(diǎn)擊「執(zhí)行意圖」; ? App 自動拉起,直接展示訂票信息頁面——成功!
相關(guān)官方鏈接
1. 通過小藝端到端調(diào)測意圖:開發(fā)者測試
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/intents-skill-all-rec-dp-self-validation
2. 意圖上架指導(dǎo):意圖標(biāo)準(zhǔn)協(xié)議上架指導(dǎo) https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/intents-kit-listing-standard-protocol 3. 意圖框架開發(fā)指南:意圖框架開發(fā)指導(dǎo) https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/insight-intent