鸿蒙做一个真正被 HarmonyOS 系统理解的 Flutter 应用,需要补哪些入口
适合谁看
-
想做完整鸿蒙 Flutter 项目的人
-
正在梳理系统入口矩阵的人
-
想把 Demo 做成更完整产品的人
问题背景
"适配鸿蒙"和"被鸿蒙系统理解"不是同一件事。
前者更偏运行:能构建、能启动、能调用一些能力。
后者更偏入口和系统协同:系统知道怎么打开你、系统知道你支持哪些能力、用户能在系统层提前感知你。
两者的差距:
|
维度 |
适配鸿蒙 |
被鸿蒙系统理解 |
|---|---|---|
|
启动方式 |
只有主图标 |
主图标 + 搜索直达 + 桌面卡片 |
|
系统搜索 |
找不到 |
能被小艺搜索发现 |
|
桌面展示 |
无 |
有桌面卡片 |
|
系统能力 |
基础 API |
语音 + TTS + 防窥 |
|
用户感知 |
"能用" |
"好用" |
项目中的真实场景
食界探味当前已经体现的入口和系统协同:
|
能力 |
文件 |
作用 |
|---|---|---|
|
主图标启动 |
|
应用主入口 |
|
语义入口 |
|
搜索直达 |
|
跨层桥接 |
|
原生 → Flutter |
|
桌面卡片 |
|
每日推荐 |
|
防窥保护 |
|
系统安全 |
|
语音识别 |
|
语音输入 |
|
TTS |
|
语音播报 |
核心实现
一、四层入口矩阵
一个更完整的鸿蒙 Flutter 项目,至少可以从四层补入口:
┌─────────────────────────────────────────────────┐
│ 第 1 层:主应用入口 │
│ │
│ EntryAbility │
│ ├─ 主图标启动 │
│ ├─ 冷启动参数承接 │
│ └─ 热启动参数转发 │
│ │
├─────────────────────────────────────────────────┤
│ 第 2 层:系统理解型入口 │
│ │
│ Intents Kit │
│ ├─ 搜索直达(小艺搜索) │
│ ├─ 功能页直达 │
│ └─ 参数化页面跳转 │
│ │
├─────────────────────────────────────────────────┤
│ 第 3 层:系统触达型入口 │
│ │
│ Form Kit(桌面卡片) │
│ ├─ 每日推荐 │
│ ├─ 快捷入口 │
│ └─ 内容展示 │
│ │
├─────────────────────────────────────────────────┤
│ 第 4 层:系统协同型能力 │
│ │
│ 系统能力 │
│ ├─ 防窥保护(DeviceSecurityKit) │
│ ├─ 语音识别(CoreSpeechKit ASR) │
│ ├─ 文本转语音(CoreSpeechKit TTS) │
│ └─ Intent 导航 │
│ │
└─────────────────────────────────────────────────┘
二、第 1 层:主应用入口——EntryAbility
这是最基础的一层。EntryAbility.ets 负责:
export default class EntryAbility extends FlutterAbility {
configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
GeneratedPluginRegistrant.registerWith(flutterEngine)
flutterEngine.getPlugins()?.add(new SpeechRecognitionPlugin())
flutterEngine.getPlugins()?.add(new TextToSpeechPlugin())
flutterEngine.getPlugins()?.add(new IntentNavigationPlugin())
flutterEngine.getPlugins()?.add(new AntiPeepProtectionPlugin())
}
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
super.onCreate(want, launchParam)
const pageId = want.parameters?.['pageId'] as string;
if (pageId) {
IntentNavigationPlugin.setPendingNavigation(pageId, dishId);
}
}
}
主应用入口需要处理:
|
能力 |
说明 |
|---|---|
|
主图标启动 |
用户点击应用图标 |
|
冷启动参数 |
从系统入口启动时携带参数 |
|
插件注册 |
注册所有原生插件 |
|
窗口配置 |
全屏、状态栏等 |
三、第 2 层:系统理解型入口——Intents Kit
Intents Kit 让鸿蒙系统理解你的应用"能做什么":
{
"insightIntents": [{
"intentName": "JumpFunctionPage",
"inputParams": [{
"properties": {
"pageId": {
"type": "string",
"enum": [
{ "value": "search", "displayName": "搜索美食", "keywords": ["搜索", "找菜"] },
{ "value": "explore", "displayName": "探索美食", "keywords": ["探索", "推荐"] },
{ "value": "dish_detail", "displayName": "查看菜品详情", "keywords": ["菜品", "详情"] }
]
}
}
}]
}]
}
系统理解型入口的价值:
|
能力 |
说明 |
用户感知 |
|---|---|---|
|
搜索直达 |
用户搜索关键词可直达 |
"这个应用能搜美食" |
|
语义化入口 |
displayName + keywords |
系统知道应用能做什么 |
|
参数化跳转 |
pageId + dishId |
精准直达目标页面 |
四、第 3 层:系统触达型入口——桌面卡片
桌面卡片让应用内容出现在鸿蒙桌面上:
{
"forms": [{
"name": "DailyRecommendCard",
"displayName": "今日探味",
"updateEnabled": true,
"scheduledUpdateTime": "00:05",
"defaultDimension": "2*4"
}]
}
桌面卡片的价值:
|
能力 |
说明 |
用户感知 |
|---|---|---|
|
每日推荐 |
每天自动更新内容 |
"系统每天给我推荐" |
|
快捷入口 |
点击直达应用 |
"不用打开应用就能看到" |
|
固定展示位 |
不和应用内布局竞争 |
"桌面上有个推荐" |
五、第 4 层:系统协同型能力
这些能力虽然不是入口本身,但会显著影响项目"像不像鸿蒙应用":
|
能力 |
鸿蒙 API |
作用 |
用户感知 |
|---|---|---|---|
|
防窥保护 |
DeviceSecurityKit |
保护隐私内容 |
"别人偷看时自动隐藏" |
|
语音识别 |
CoreSpeechKit ASR |
语音输入 |
"可以直接说话搜索" |
|
TTS |
CoreSpeechKit TTS |
语音播报 |
"可以听推荐" |
六、Flutter 侧的承接
鸿蒙原生入口再多,Flutter 侧也需要承接:
// intent_navigation_channel.dart
static const _pageIdToRoute = <String, String>{
'search': '/search',
'ai_assistant': '/ai-assistant',
'wish_box': '/wish-box',
'ingredients': '/ingredients',
'explore': '/explore',
};
Flutter 侧要做的是:
|
工作 |
说明 |
|---|---|
|
路由映射 |
pageId → Flutter 路由 |
|
内容承接 |
卡片点击后打开对应页面 |
|
语义一致 |
应用内推荐和卡片推荐内容一致 |
|
语音交互 |
接收 ASR 文本,调用 AI,播放 TTS |
七、完整的入口矩阵图
┌─────────────────────────────────────────────────┐
│ 鸿蒙系统层 │
│ │
│ 小艺搜索 → 匹配 keywords → 调起应用 │
│ 桌面卡片 → 展示推荐 → 点击进入 │
│ 系统设置 → 防窥保护 → 保护隐私 │
│ 语音助手 → ASR 识别 → 语音输入 │
│ │
├─────────────────────────────────────────────────┤
│ 鸿蒙壳工程层 │
│ │
│ EntryAbility → 主入口 + 插件注册 │
│ InsightIntentExecutorImpl → 参数校验 │
│ IntentNavigationPlugin → 桥接 Flutter │
│ DailyRecommendFormAbility → 卡片生命周期 │
│ SpeechRecognitionPlugin → 语音识别 │
│ TextToSpeechPlugin → TTS │
│ AntiPeepProtectionPlugin → 防窥保护 │
│ │
├─────────────────────────────────────────────────┤
│ Flutter 层 │
│ │
│ intent_navigation_channel → 路由映射 │
│ anti_peep_protection_channel → 防窥状态 │
│ speech_recognition_channel → 语音识别 │
│ text_to_speech_channel → TTS │
│ AI 助手页 → 接收语音 + 调用 AI + 播报 │
│ │
└─────────────────────────────────────────────────┘
关键代码位置
|
文件 |
作用 |
|---|---|
|
|
主入口 |
|
|
语义入口配置 |
|
|
参数校验 |
|
|
跨层桥接 |
|
|
桌面卡片 |
|
|
防窥保护 |
|
|
语音识别 |
|
|
TTS |
|
|
Flutter 路由映射 |
鸿蒙入口成熟度评估
|
等级 |
入口 |
说明 |
|---|---|---|
|
L1 基础 |
主图标启动 |
能安装、能打开 |
|
L2 理解 |
Intents Kit + 搜索直达 |
系统能理解应用 |
|
L3 触达 |
桌面卡片 |
内容出现在桌面 |
|
L4 协同 |
语音 + TTS + 防窥 |
系统能力深度整合 |
|
L5 生态 |
多入口矩阵 |
完整的鸿蒙入口体验 |
食界探味当前已经从 L1 做到了 L4,正在向 L5 迈进。
常见坑
-
只做主图标启动,就以为已经完成系统接入 — 至少还应该有 Intents Kit
-
接了搜索直达,却没有稳定路由映射层 — pageId → Flutter 路由必须可靠
-
做了桌面卡片,却没有应用内承接 — 用户点击卡片后应该进入有意义的页面
-
系统能力很多,但边界和分工没有提前划清 — 四层入口各司其职
-
没有处理冷启动参数 — EntryAbility.onCreate 必须缓存 pending
-
关键词覆盖不全 — 小艺搜索找不到你的入口
可复用模板
鸿蒙入口矩阵检查清单
第 1 层:主应用入口
□ EntryAbility 是否注册了所有插件?
□ 冷启动参数是否处理?
□ 热启动参数是否转发?
第 2 层:系统理解型入口
□ insight_intent.json 是否配置?
□ intent 名称是否稳定?
□ pageId 是否有 enum 限制?
□ keywords 是否覆盖用户搜索词?
第 3 层:系统触达型入口
□ 桌面卡片是否配置?
□ updateEnabled 是否启用?
□ 卡片点击后是否跳转正确?
第 4 层:系统协同型能力
□ 语音识别是否接入?
□ TTS 是否接入?
□ 防窥保护是否接入?
□ 各能力的边界是否清晰?
鸿蒙入口优先级模板
优先级 1(必须):
- 主图标启动
- 冷启动参数处理
优先级 2(强烈建议):
- Intents Kit 搜索直达
- 路由映射层
优先级 3(推荐):
- 桌面卡片
- 语音识别 + TTS
优先级 4(锦上添花):
- 防窥保护
- 更多系统能力
本篇总结
真正被 HarmonyOS 系统理解的 Flutter 应用,一定不止一个图标入口。食界探味的实践展示了四层入口矩阵:
-
主应用入口 — EntryAbility + 冷启动参数
-
系统理解型入口 — Intents Kit + 搜索直达
-
系统触达型入口 — 桌面卡片
-
系统协同型能力 — 语音 + TTS + 防窥
入口矩阵、触达矩阵和系统能力矩阵一起补,项目的完整度会明显提升。到这一步,Flutter 项目才算真正进入"鸿蒙化"阶段。
更多推荐




所有评论(0)