AOD Navigation Kit 熄屏导航的状态接续与低功耗运行机制【鸿蒙心迹】
手机都熄屏了,导航为什么还能持续显示轨迹、里程和关键信息?

做导航应用的时候,最开始的思路很简单:亮屏导航,用户看屏幕。
结果真用的时候发现不对:用户开车的时候,熄屏了,不想一直亮屏耗电。但熄屏了,导航就没了。用户又不想每过几秒按一下电源键。
这时候才意识到:熄屏不是结束导航,是导航换了一种显示方式。
一、先想清楚:亮屏导航和熄屏导航有什么区别
先把最基础的问题想明白。
| 对比 | 亮屏导航 | 熄屏导航 |
|---|---|---|
| 显示 | 完整地图、路线、细节 | 关键信息:轨迹、里程、转弯 |
| 功耗 | 高,全亮屏 | 低,只点亮必要像素 |
| 更新频率 | 高,实时刷新 | 低,关键节点更新 |
亮屏导航是给用户盯着看的。熄屏导航是给用户瞟一眼的。需求不一样,显示方式也不一样。
二、AOD Navigation Kit 是什么
AOD 就是 Always On Display,熄屏显示。AOD Navigation Kit 是专门给导航应用做的熄屏导航能力。
它不是让你把整个 ArkUI 页面搬到熄屏上。它是让你把关键导航信息交给系统,系统在熄屏界面上显示。
这段代码解决什么问题: 初始化 AOD 导航管理。
文件: navi/AodNaviManager.ets
用途: 熄屏导航状态管理
接入位置: 导航开始时
import { aodNaviManager } from '@kit.AODNavigationKit';
// 创建 AOD 导航管理器
let manager = aodNaviManager.createAodNaviManager();
// 开始导航,进入熄屏模式
manager.startNavi({
routeId: 'route_001',
totalDistance: 5000,
remainingDistance: 3200
});
这里不是你自己画熄屏界面。是你把数据传给系统,系统帮你显示。
三、按下电源键之后发生了什么
按一下电源键,屏幕熄了。导航 App 发生了什么?
不是 App 停止了。是导航状态从"亮屏模式"切换到"熄屏模式":
- App 收到屏幕熄灭事件;
- App 把关键导航数据交给 AOD 系统;
- 系统接管熄屏显示,显示轨迹、里程、转弯提示;
- App 降低数据更新频率,省电;
- 用户再按电源键,亮屏;
- 系统把状态交回给 App,App 恢复完整导航界面。

四、为什么不能简单理解成"熄屏后继续运行原来的页面"
很多人以为:熄屏了,原来的页面继续跑,只是屏幕暗了。不对。
熄屏导航不是原来的页面。是系统在熄屏界面上画了一层导航信息。
| 误解 | 实际 |
|---|---|
| 原来的页面继续跑 | 不是,系统接管了 |
| 数据更新频率不变 | 不对,要降低省电 |
| 亮屏和熄屏是两套数据 | 不对,是同一份数据 |
关键是:同一份导航状态,亮屏和熄屏只是显示方式不同,数据是同一个。不能搞成两套数据,那就乱了。
五、低功耗是怎么做到的
熄屏导航为什么省电?
| 措施 | 效果 |
|---|---|
| 只点亮必要像素 | 不需要全亮屏 |
| 降低更新频率 | 不用每 100ms 刷新 |
| 简化显示内容 | 不用画完整地图 |
| 系统级显示 | 系统优化比 App 更懂硬件 |
最关键的是系统级显示。系统知道怎么点亮屏幕最省电,比你在 App 里自己控制要高效得多。
六、几个容易踩的坑
第一个坑:把 AOD 当普通 ArkUI 页面。不对,它是系统级显示。
第二个坑:熄屏后仍高频刷新完整导航数据。太耗电了,熄屏只需要更新关键节点。
第三个坑:亮屏和熄屏维护两套业务状态。不对,同一份数据,两种显示。
第四个坑:结束导航后 AOD 状态未清理。导航结束了,熄屏还显示导航信息。
第五个坑:前后台、锁屏和熄屏概念混用。这三个是不一样的。
第六个坑:为了实时性无限提高数据更新频率。越实时越耗电,要平衡。

这次做熄屏导航最大的体会是:熄屏导航不是"把页面搬到熄屏上",是状态交接。App 把数据交给系统,系统负责在熄屏上显示关键信息。
真正做的时候,最容易忽略的不是怎么显示,而是状态一致性。亮屏和熄屏切换的时候,数据不能断,状态不能乱。用户按一下电源键,亮屏了,应该看到的还是刚才那条路线,不能重新开始。
更多推荐





所有评论(0)