lightbulb_outline Please take our October 2018 developer survey. Start survey

优化表盘

表盘持续不断地运行,所以必须高效地使用电能。

另外,表盘的性能也应当优化。Service 不得执行不必要的计算。带有动画的表盘在适应通知和系统指示器时必须顺畅地运行。

基本优化

此部分包含在表盘处于不活动时提升效率的最佳做法。

在 WatchFaceService.Engine 中使用回调

确保您的表盘仅在处于活动状态时执行计算;请在 WatchFaceService.Engine 中使用回调。最好使用该类的下列函数来确定表盘是否可见:

  • onVisibilityChanged(boolean)
  • isVisible()

或者使用同一个类 (WatchFaceService.Engine) 的下列函数:

  • onCreate()
  • onDestroy()

使用通过 DataApi 接口注册的侦听器

要侦听 Event,请使用通过 DataApi.addListener 注册的实时侦听器。如需了解示例,请参阅同步数据项

请不要使用 WearableListenerService 侦听 Event,因为无论表盘是否处于活动状态都会调用它。如需了解详细信息,请参阅使用 Android Wear API 弃用 BIND_LISTENER

不要在 Android manifest 文件中注册广播接收器来获取系统 Event(如时区更改、电池事件,等等),因为无论表盘是否处于活动状态都会调用 BroadcastReceiver。不过,您可以使用 Context 类的 registerReceiver 函数来注册接收器。

监控耗电量

Android Wear 配套应用让开发者和用户能够看到穿戴式设备上不同进程消耗的电量(位于 Settings > Watch battery 下)。

Android 5.0 中引入了一些有助于增加电池续航时间的功能,如需了解与这些功能有关的信息,请参阅 Volta 项目

注册加密感知表盘

Android 7.0 及更高版本包括对文件级加密的支持,并允许加密感知应用提前运行,无需用户在启动时提供解密密码。这可以将从启动动画到表盘的过渡时间最多缩短 30 秒。

要使启动速度更快,请将 android:directBootAware="true" 添加到表盘 manifest 中。

:请将此功能与不使用凭据加密存储的表盘结合使用。

动画的最佳做法

本部分的最佳做法有助于降低动画的耗电量。

降低动画的帧速率

动画的计算开销通常过大,且十分耗电。大多数动画在帧速率为每秒 30 帧时看起来已经比较流畅,所以您应避免以更高的帧速率运行动画。

使 CPU 在各动画之间休眠

动画和对表盘内容的细微更改会唤醒 CPU。您的表盘应使 CPU 在各动画之间休眠。例如,您可以在交互模式下使用每秒短时动画,然后使 CPU 休眠到下一秒。使 CPU 经常休眠,即使时间很短,也可以大幅度地降低耗电量。

要最大程度增加电池续航时间,请谨慎使用动画。即使是一个闪烁的冒号,每次闪烁也会唤醒 CPU,并影响电池续航时间。

缩减位图资源的大小

许多表盘都包含背景图片和其他图形资源,它们会在背景图片上转换和重叠,例如时钟指针和其他设计元素会随着时间移动。如绘制表盘中所述,在系统每次重新绘制表盘时,这些图形元素通常会在 Engine.onDraw() 函数内旋转(有时会缩放)。

这些图形资源越大,转换它们需要的计算开销就越大。在 Engine.onDraw() 函数中转换较大的图形资源会大幅度地降低系统运行动画的帧速率。

图 1. 可以修剪时钟指针来移除多余像素。

要提升表盘的性能,请执行以下操作:

  • 请不要使用大于实际需要的图形元素。
  • 移除边缘多余的透明像素。

图 1 左侧的示例时钟指针大小可以缩小 97%。

如本部分所述,缩减位图资源的大小不仅能够提升动画性能,还可以省电。

组合位图资源

如果您的位图经常一起绘制,请考虑将它们组合到同一个图形资源中。您通常可以在交互模式下将背景图片与刻度线组合到一起,避免在系统每次重新绘制表盘时绘制两个全屏位图。

绘制缩放后的位图时停用抗锯齿

当您使用 Canvas.drawBitmap() 函数在 Canvas 对象上绘制缩放后的位图时,您可以提供 Paint 实例来配置多个选项。要提升性能,请使用 setAntiAlias() 函数停用抗锯齿,因为此选项对位图没有任何影响。

图 2. 停用(左侧)和启用(右侧)的位图过滤实例。

使用位图过滤

对于您在其他元素上绘制的位图资源,请使用 setFilterBitmap() 函数在相同的 Paint 实例上启用位图过滤。图 2 显示了带有和不带位图过滤的时钟指针放大视图。

:在低位微光模式下,系统无法在图像中为位图过滤可靠地渲染颜色以成功处理。当微光模式处于活动状态时,请停用位图过滤。

将开销大的操作移出绘制函数

系统每次重新绘制表盘时都会调用 Engine.onDraw() 函数,所以您只需在此函数中包含更新表盘所必需的操作,从而提升性能。

如有可能,请避免在 Engine.onDraw() 函数中执行以下操作:

  • 加载图像和其他资源。
  • 调整图像大小。
  • 分配对象。
  • 执行结果在各个帧之间不会改变的计算任务。

不过,您通常可以在 Engine.onCreate() 函数中执行上述操作。您可以在 Engine.onSurfaceChanged() 函数中提前调整图像大小,此函数会为您提供画布的大小。

要分析表盘的性能,请使用 Android 设备监视器。特别是,请确保 Engine.onDraw() 实现的执行时间在调用过程中短暂且持续。如需了解详细信息,请参阅使用 DDMS