手机都熄屏了,导航为什么还能持续显示轨迹、里程和关键信息?

状态流转图

做导航应用的时候,最开始的思路很简单:亮屏导航,用户看屏幕。

结果真用的时候发现不对:用户开车的时候,熄屏了,不想一直亮屏耗电。但熄屏了,导航就没了。用户又不想每过几秒按一下电源键。

这时候才意识到:熄屏不是结束导航,是导航换了一种显示方式。

一、先想清楚:亮屏导航和熄屏导航有什么区别

先把最基础的问题想明白。

对比亮屏导航熄屏导航
显示完整地图、路线、细节关键信息:轨迹、里程、转弯
功耗高,全亮屏低,只点亮必要像素
更新频率高,实时刷新低,关键节点更新

亮屏导航是给用户盯着看的。熄屏导航是给用户瞟一眼的。需求不一样,显示方式也不一样。

二、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 停止了。是导航状态从"亮屏模式"切换到"熄屏模式":

  1. App 收到屏幕熄灭事件;
  2. App 把关键导航数据交给 AOD 系统;
  3. 系统接管熄屏显示,显示轨迹、里程、转弯提示;
  4. App 降低数据更新频率,省电;
  5. 用户再按电源键,亮屏;
  6. 系统把状态交回给 App,App 恢复完整导航界面。

熄屏导航效果图

四、为什么不能简单理解成"熄屏后继续运行原来的页面"

很多人以为:熄屏了,原来的页面继续跑,只是屏幕暗了。不对。

熄屏导航不是原来的页面。是系统在熄屏界面上画了一层导航信息。

误解实际
原来的页面继续跑不是,系统接管了
数据更新频率不变不对,要降低省电
亮屏和熄屏是两套数据不对,是同一份数据

关键是:同一份导航状态,亮屏和熄屏只是显示方式不同,数据是同一个。不能搞成两套数据,那就乱了。

五、低功耗是怎么做到的

熄屏导航为什么省电?

措施效果
只点亮必要像素不需要全亮屏
降低更新频率不用每 100ms 刷新
简化显示内容不用画完整地图
系统级显示系统优化比 App 更懂硬件

最关键的是系统级显示。系统知道怎么点亮屏幕最省电,比你在 App 里自己控制要高效得多。

六、几个容易踩的坑

第一个坑:把 AOD 当普通 ArkUI 页面。不对,它是系统级显示。

第二个坑:熄屏后仍高频刷新完整导航数据。太耗电了,熄屏只需要更新关键节点。

第三个坑:亮屏和熄屏维护两套业务状态。不对,同一份数据,两种显示。

第四个坑:结束导航后 AOD 状态未清理。导航结束了,熄屏还显示导航信息。

第五个坑:前后台、锁屏和熄屏概念混用。这三个是不一样的。

第六个坑:为了实时性无限提高数据更新频率。越实时越耗电,要平衡。

调用时序图

这次做熄屏导航最大的体会是:熄屏导航不是"把页面搬到熄屏上",是状态交接。App 把数据交给系统,系统负责在熄屏上显示关键信息。

真正做的时候,最容易忽略的不是怎么显示,而是状态一致性。亮屏和熄屏切换的时候,数据不能断,状态不能乱。用户按一下电源键,亮屏了,应该看到的还是刚才那条路线,不能重新开始。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐