您的智能手表应用程序中“不要做”的事情





5.00/5 (3投票s)
本文列举了一些在为智能手表编写应用程序时必须考虑的事项。
引言和背景
这是“Android Wear”应用程序开发系列中的另一篇文章,但视角略有不同。在之前的文章中,我一直在谈论编程的“如何做”和“是什么”。在这篇简短的指南中,我将谈谈一些您可能会做的事情,这些事情会毁掉“效率”的整个概念。您明白“内存和电池电量有限”的意思,不是吗?
如果您理解智能手表平台,那么您将更容易理解本文的逻辑和原因。几乎所有智能手表都具有相同的硬件和软件功能和服务。因此,无论是 Android Wear(通常)还是您想到的任何其他智能手表,其硬件组件和软件服务(或多或少)与其他设备可能提供的相同!设备包括:
- 仅够设备运行的电池电量
- 仅够运行几个组件的内存
- 显示时间和日期是其中之一。
- 处理服务时,Android Wear 可能会听到用户说:“Ok Google...”。
- 只有一些其他事情,比如绘制表盘;这确实是另一项服务。
- 足够的辅助存储空间来保存一些东西,包括操作系统本身。
由于这些事实,大多数智能手表并没有用户可能想要使用的服务,并且总是强制执行这些做法,因为开发人员可能想要超越界限,为了“良好的服务”而浪费资源,比如电池。因此,在为智能手表编写应用程序时,您必须牢记这些事项。它是一款智能手表,但资源非常少,而且不需要发热。您难道期望在手腕上戴一个发热球吗?
在这篇文章中,我将列出一些不会花费您太多精力,但能确保您的应用程序运行得更好,并且使用您应用程序的用户不必耗尽双方资源只是为了确保应用程序运行的做法!
您可能想阅读我发布的其他文章,
本文将侧重于微调您开发的应用程序的技巧!
Android Wear API 有什么?
虽然我的文章更直接地与 Android Wear 相关,但总的来说,几乎所有这些智能手表都提供相同数量的功能和服务供开发人员进行应用程序开发。Android Wear 具有适用于以下方面的 API 功能和规范:
- 原生可穿戴可执行文件。
- 配套应用程序处理对象。
- 输入/输出服务和管理器。
- 管理您的应用程序视图。
- 为您的客户生成表盘。
这些服务是供客户端使用和服务的。当然,您可以使用 Wi-Fi 等其他服务,但不建议这样做,因为它会耗尽电池寿命。该软件包索引列出了这些服务和 API,并附有说明。
“不该做”的事
首先,我将列出可能导致您的应用程序耗尽双方资源的主题。我将指出其中的一些问题,并指出如何在代码中避免这些情况和问题。
在我看来,智能手表作为一个框架或平台,尚未准备好像您使用任何其他手表或任何其他智能设备那样使用。首先是智能手表设备中可用的资源。根据您应用程序的复杂程度,智能手表可能不具备足够的支持,让您甚至能够(正如其名称所示)使用一整天!您的普通手表可以告诉您日期和时间,如果您抬头看看天空,您就能确定天气是阴天还是晴天等。此外,如果您只是简单地记住您的妻子或老板今天稍后告诉您要做的事情,您就不需要携带另一个应用程序或设备来提醒您以后的活动。
智能手表声称可以处理所有这些。智能手表为您提供以下选项:
- 了解现在是什么时间以及日期(人类历史上的伟大发明?)
- 查找天气详情,无论是下雨还是应该穿棉质衣服。(当然,您可以看看窗外天空,就能确定天气如何)
- 您今天晚些时候想做什么,事件会按预期进行管理和显示。(我将把这件事留给智能手表处理)
但是,大多数开发人员所做的是他们试图超越界限,并强迫它做它不应该做的事情。另外,如果您阅读了(我上面建议的)文章,您会发现我和 OriginalGriff 的对话非常有说服力!这篇文章和其中的几个部分也是基于他在那次对话中说过的话的。
1. 不要浪费 CPU
浪费 CPU 意味着浪费 CPU 为处理不同进程和指令产生的周期。每个指令都需要一堆周期,周期越多,CPU 必须工作越多。因此,CPU 必须工作越多,它就越节省电池。
CPU 可以通过多种方式被浪费
- 执行过多(不必要)的计算。
算术和其他必需的计算。 - 以快速刷新率生成图形;60Hz 没有意义。
- 执行基于网络的请求和操作
智能手表不得执行基于网络的请求,而应考虑在连接的手持设备上执行这些操作。
还有许多其他因素,例如糟糕的代码、糟糕的软件设计、糟糕的实现等,所有这些因素都会导致您的应用程序浪费 CPU。在接下来的章节中,例如网络、RAM 等类似章节,CPU 再次被使用。因此,最重要因素是 CPU。始终尝试节省 CPU 周期,并在您的应用程序或用户不想交互时让 CPU 休息。
技巧
- 不要一直使用 CPU!
- 等待用户与设备交互以继续另一项功能。
- 避免一直在后台运行另一个功能。
- 考虑在手持设备中运行此类后台任务!
- 在手持设备上执行耗时、基于网络的请求和数学运算,然后通过配套应用程序将结果传输到设备。
2. 不要浪费 RAM
沿着瀑布下来,在 CPU 之后,RAM 是另一个主要因素,它可能导致用户从疯狂喜爱您的应用程序变成疯狂于应用程序糟糕的用户体验。您在应用程序中创建的每个变量都会消耗 RAM。虽然 RAM 是随机访问内存,但这并不意味着您可以用任何垃圾值来填充它。您应用程序中的变量,例如
public final static int PI = 3.14; // You can memorize that value, can't you? And use it as a literal in the code // Or at worse int add(int a) { int b = 5; int c = a + b; return c; }
这只是假设,大多数开发人员都不会这样做,而那些这样做的人,请不要这样做。
提示:如果您不明白上面哪里出错了,
int add(int a) { return a + 5; }
避免在可以使用字面量或已有数据的地方创建变量。
在智能手表中,您为画布创建的图形也会在 RAM 中进行计算和存储。图形、位图和其他资源都存储在 RAM 中,以便以后使用。此外,如果您操作图形对象,它们也会使用 CPU。如前所述,CPU 是几乎所有进程中使用的核心因素,因此更新 RAM 的内容也需要一些 CPU 周期。您不仅在浪费 RAM,还在浪费 CPU 周期!
每次更新 RAM 时,CPU 都必须通过将数据发送到 RAM 来更新内容,然后 RAM 更新地址,然后 CPU 需要被通知内容已更新,等等。所以它再次需要大量的 CPU 周期。每次运行动画时,图形对象都会被更新(基于您提供的数据和矩阵),因此 CPU 必须运行周期来完成请求,然后更新屏幕。
技巧
- 您可以考虑使用更少的变量,并尽量避免使用不必要的变量。
- 避免使用不可变类型;例如,更新字符串值。
每次更新变量时,前一个对象都会被删除(从虚拟机持有的引用中移除),并创建一个新对象并由该变量引用。
3. 避免使用更大的位图并再次考虑刷新率
智能手表具有图形功能,可以轻松构建带有图形的应用程序。但是图形不能浪费 CPU 或 RAM。常见的问题是您可能使用单个图形对象或可绘制资源。考虑使用不会浪费大量 CPU 处理、RAM 空间等的尺寸。您生成的图形需要渲染,而 CPU 周期再次处于危险之中。
您可以裁剪位图和可绘制资源的边缘,使其适合您的需求。如果您的图像有空白,请将其删除,裁剪角落,删除可绘制资源中的额外空白区域。较小的可绘制资源需要更少的 CPU 来计算,更少的 RAM 来存储,以及更少的时间在屏幕上渲染。
设备还可以以 30Hz 的刷新率渲染动画。您的智能手表的大多数图形都可以以 30Hz 的刷新率完整清晰地渲染,使用 60Hz 没有意义。此外,如果动画需要 60Hz 的刷新率,那么它对智能手表来说效率不高,请重新考虑该动画的设计和方法,使其适合智能手表。
技巧
- 使用较小的可绘制资源、位图。
它们节省了 CPU 和 RAM,以及渲染它们所需的时间。 - 为动画使用 30Hz 的刷新率。
- 为不同的设备使用不同的位图,并针对该设备的大小和屏幕像素密度进行微调。
4. 智能手表尚未准备好进行基于网络的请求
Android 团队提供的无线连接只是为了将设备与您的手持设备连接起来。它们并非用于与您周围的世界进行网络通信!最初,只支持蓝牙通信。现在,Wi-Fi 也已添加到库中。它仍然可以向 HTTP 服务器发出请求。但那不是一个好方法!
您绝不能构建在设备上通过 Wi-Fi 发送 HTTP 请求的应用程序,因为它会耗尽设备的电池寿命。虽然 Wi-Fi 会将请求发送到 HTTP 服务器,您可以以 JSON 格式从 Web API 下载内容,但这不能保证有效,因为一旦使用蓝牙连接了配套应用程序,Wi-Fi 就会关闭。因此,Wi-Fi 将被关闭,并且消耗的电池寿命将被浪费(在发送该 HTTP 请求并等待响应时)。
Android 团队最近发布了另一项更新,最新 Android Wear 更新中的 Always-on 和 Wi-Fi。更新解释说,尽管已添加了 Wi-Fi 的软件支持,但您必须依靠 Android Wear 中的数据层和配套设备来与外部世界通信。Wi-Fi 不得用于 HTTP 请求,这就是手持设备的作用。使用该设备下载数据,然后将其发送到您的手表。
5. 节省电池!
我在这里写下的不是人道主义的理由,而是良好的用户体验。用户不喜欢随身携带设备充电器,以确保他们每 12-24 小时为设备充电。三星的 Gear 设备存在这个问题,如果设备像用户使用智能手表那样使用,设备就需要定期充电。
如果需要定期为设备充电,那么模拟手表就可以满足显示您的
- 时间
- 日期
- 事件(如果您能记住时间和地点)
……而且电池续航长达 30 天!大多数手表甚至更长。
在以上所有情况下,都会使用电池。
- 为使 CPU 能够执行。
- 使 RAM 能够保存或提供数据
- 使屏幕能够显示图形
- 使用蓝牙或 Wi-Fi 与设备建立连接。
- 其他一切...
电池是必需的,即使是 Android 本身的基本运行。无论他们如何努力工作,以在持续使用的情况下保持设备运转,最长使用时间是 2 天(或待机一周)。问题仍然是电池,而您的应用程序没有考虑到电池使用情况,可能会在一小时内耗尽所有电池电量。永远不要这样做。
这是浪费电池最常见的方式,电池也被其他设备和硬件组件使用。例如,振动器和其他传感器也使用电池寿命来运行。您的智能手表中的振动器不应长时间使用,因为它会消耗电池寿命。默认情况下,Android 会在 6 秒后关闭振动器。如果需要连续运行传感器,它们会消耗电池寿命。
技巧
- 即使您使用智能设备或不使用,电池也会耗尽;处于待机模式。
- CPU、RAM、I/O、连接、屏幕、触摸输入和其他硬件组件都靠电池运行!
- 必须对硬件组件进行微调,并重新配置 API,以确保它们使用的电池寿命足够且不会浪费。
- 尝试在用户需要时触发功能。不要一直执行功能并强迫 CPU 工作。让 CPU 休息!
关注点
在上面的帖子中,我提到了一些导致您的应用程序耗尽资源的因素以及您可以用来使应用程序对用户更好的技巧。这些技巧基于软件工程实践,以确保应用程序的设计被实现以使其高效。
这些技巧是基于
- CPU 消耗。
- RAM 使用情况。
- 图形渲染和屏幕像素内容。
- 硬件组件电池使用情况。
- 连接设置等等。
此外,需要后台线程的任务需要被推送到手持设备上,因为手持设备的电池、CPU 和 RAM 资源要多得多。您应该考虑在那里执行复杂任务,然后将响应或结果发送到智能手表进行显示!
- 允许 CPU 休眠。
仅在用户需要时触发 CPU 唤醒并执行计算。不要通过编程方式自行启动活动。 - 保持 RAM 中没有垃圾变量,尽量将大部分数据保存在手持设备上,并在需要时传输到设备!
- 不要长时间使用硬件组件(例如振动器和传感器)。它很烦人(手腕上的设备振动),而且还会浪费电池寿命。
- 使用小的可绘制资源。较小的资源使用更少的 CPU 周期、更少的 RAM 空间、更少的渲染时间,并且效果更好。
- 使用较低的帧刷新率
30Hz 就足够了!
最后,在创建 Android Wear 的任何东西之前,请记住资源!它还没有准备好成为一个执行智能事务的平台。笔记本电脑刚出现时,人们也曾说过同样的话,电池、CPU 和 RAM 都是问题。现在那已不再是什么大问题了。智能手表很快就会拥有足够的资源和电力,可以运行一周并执行我们需要的任务。但在此之前,让我们尽量避免浪费资源。
祝您构建智能手表应用程序愉快!:-)