优化网络访问

使用无线电传输数据可能是应用程序最主要的电池消耗源之一。为了最大限度地减少与网络活动相关的电池消耗,了解您的连接模型将如何影响底层无线电硬件至关重要。

本节介绍无线电状态机,并解释您的应用程序连接模型如何与其交互。然后它提供了几种技术,这些技术在遵循时将有助于最大限度地减少应用程序数据消耗对电池的影响。

无线电状态机

用户设备上的无线电具有内置的节能功能,有助于最大限度地减少其消耗的电池电量。当无线电完全处于活动状态时,它会消耗大量电量,但当处于非活动状态或待机状态时,无线电消耗的电量非常少。

要记住的一个重要因素是无线电无法立即从待机状态转换为完全活动状态。与“启动”无线电相关联的延迟。因此,电池从高能状态到低能状态的过渡速度较慢,以便在不使用时节省电量,同时尝试最大限度地减少与“启动”无线电相关的延迟。

典型 3G 网络无线电的状态机包含三种能态

  • 满功率:在连接处于活动状态时使用,允许设备以其最高可能的速度传输数据。
  • 低功率:一种中间状态,可将电池电量消耗降低约 50%。
  • 待机:在没有活动网络连接的最小功耗状态。

虽然低功率和待机状态消耗的电池电量明显更少,但它们也会给网络请求带来很大的延迟。从低功率状态返回到满功率需要大约 1.5 秒,而从待机状态转换为满功率则可能需要超过 2 秒。

为了最大限度地减少延迟,状态机使用延迟来推迟转换为低能态。图 1 使用 AT&T 的时间来表示典型的 3G 无线电。


图 1. 典型的 3G 无线电状态机。

每个设备上的无线电状态机,特别是相关的转换延迟(“尾部时间”)和启动延迟,将根据所采用的无线电技术(3G、LTE、5G 等)而有所不同,并且由设备运行的运营商网络定义和配置。

本页根据 AT&T 提供的数据描述了典型 3G 无线电的代表性状态机。但是,一般的原理和由此产生的最佳实践适用于所有无线电实现。

这种方法对于典型的移动网页浏览特别有效,因为它可以防止用户在浏览网页时出现意外的延迟。相对较短的尾部时间还确保一旦浏览会话结束,无线电就可以转换为低能态。

不幸的是,这种方法可能会导致在 Android 等现代智能手机操作系统上运行的应用程序效率低下,这些应用程序在前景(延迟很重要)和后台(应优先考虑电池寿命)中运行。

应用如何影响无线电状态机

每次创建新的网络连接时,无线电都会过渡到全功率状态。在前面提到的典型 3G 无线电状态机的情况下,它将在传输持续时间内保持全功率状态,另外加上 5 秒的尾部时间,然后在低能耗状态下持续 12 秒。因此,对于典型的 3G 设备,每次数据传输会话都会导致无线电至少消耗 18 秒的能量。

实际上,这意味着一个每分钟进行一次 1 秒数据传输的应用程序,将使无线电始终处于活动状态,并在它进入待机模式时将其重新切换到高功率状态。


图 2. 每分钟运行三次的 1 秒传输的相对无线电功率使用情况。图中不包括运行之间的“启动”延迟。

相比之下,如果同一个应用程序将数据传输捆绑在一起,每分钟进行一次 3 秒的传输,这将使无线电在高功率状态下总共仅运行 20 秒。这将使无线电能够每分钟待机 40 秒,从而显著减少电池消耗。


图 3. 每分钟运行一次的 3 秒传输的相对无线电功率使用情况。

优化技术

现在您已经了解了网络访问如何影响电池续航时间,让我们来谈谈您可以做些什么来帮助减少电池消耗,同时提供快速流畅的用户体验。

捆绑数据传输

如上一节所述,将数据传输捆绑在一起,以便更少地传输更多数据,是提高电池效率的最佳方法之一。

当然,如果您的应用程序需要立即响应用户操作接收或发送数据,这并不总是可能的。您可以通过预测并预取数据来缓解这种情况。其他场景,例如将日志或分析发送到服务器以及其他非紧急的应用程序启动的数据传输,非常适合批处理和捆绑。有关安排后台网络传输的技巧,请参阅优化应用程序启动的任务

预取数据

预取数据是减少应用程序运行的独立数据传输会话数量的另一种有效方法。使用预取,当用户在您的应用程序中执行操作时,应用程序会预测接下来的一系列用户操作最有可能需要哪些数据,并在单个连接上以全速获取这些数据。

通过预加载传输,您可以减少下载数据所需的无线电激活次数。因此,您不仅可以节省电池续航时间,还可以提高延迟、降低所需带宽并减少下载时间。

预取还可以通过最小化在执行操作或查看数据之前等待下载完成而导致的应用程序内延迟来提供更好的用户体验。

以下是一个实际示例。

新闻阅读器

许多新闻应用程序尝试通过在选择类别后才下载标题、在用户想要阅读时才下载完整文章、以及在滚动到视图中时才下载缩略图来减少带宽。

使用这种方法,无线电被迫在用户的大多数新闻阅读会话中保持活动状态,因为他们会滚动标题、更改类别和阅读文章。不仅如此,在能量状态之间不断切换会导致在切换类别或阅读文章时出现明显的延迟。

更好的方法是在启动时预取合理数量的数据,从第一组新闻标题和缩略图开始(确保低延迟启动时间),并继续预取其余标题和缩略图,以及至少来自主要标题列表的每篇文章的文本。

另一种选择是预取每个标题、缩略图、文章文本,甚至可能预取完整的文章图片,通常是在预定时间表上的后台进行。这种方法有风险,可能会消耗大量带宽和电池续航时间来下载从未使用过的内容,因此应谨慎实施。

其他注意事项

虽然预取数据有很多好处,但如果使用过于积极,预取也会带来风险,即通过下载未使用的数据来增加电池消耗和带宽使用量,以及下载配额。同样重要的是,要确保预取不会延迟应用程序启动,因为应用程序会等待预取完成。实际上,这可能意味着逐步处理数据,或启动连续传输,并按优先级排序,以便先下载和处理启动应用程序所需的数据。

预取数据的积极程度取决于要下载的数据大小以及它被使用的可能性。作为一个粗略的指南,根据前面描述的状态机,对于在当前用户会话中被使用的可能性为 50% 的数据,您通常可以预取大约 6 秒(大约 1-2 兆字节),然后下载未使用的数据的潜在成本才会与一开始不下载数据的潜在节省相匹配。

一般来说,预取数据以确保您只需每 2 到 5 分钟启动一次新的下载,并且下载量在 1 到 5 兆字节之间,这是一个好习惯。

遵循这一原则,大型下载(如视频文件)应定期(每 2 到 5 分钟)分块下载,实际上只预取接下来几分钟可能观看的视频数据。

一种解决方案是,仅在连接到 Wi-Fi 时(可能仅在设备充电时)安排完整下载。 WorkManager API 专门支持这种用例,允许您在设备满足开发人员指定的条件(如充电和连接到 Wi-Fi)之前限制后台工作。

在发出请求之前检查连接

搜索蜂窝信号是移动设备上最耗电的操作之一。对于用户启动的请求,最佳做法是首先使用 ConnectivityManager 检查连接,如监控连接状态和连接计量中所示。如果没有网络,应用程序可以通过不强制移动无线电进行搜索来节省电池电量。然后可以安排请求,并在建立连接时与其他请求一起执行。

连接池

除了批处理和预取之外,还可以使用另一种策略来帮助您,那就是将应用程序的网络连接池化。

与启动新的网络连接相比,重复使用现有的网络连接通常更有效。重复使用连接还使网络能够更智能地响应拥塞和相关的网络数据问题。

HttpURLConnection 和大多数 HTTP 客户端(例如 OkHttp)默认情况下支持连接池,并在多个请求中重复使用相同的连接。

回顾和展望

在本节中,您了解了有关无线电和您可以广泛应用的一些策略,这些策略可以提供快速响应的用户体验,同时减少电池消耗。

在下一节中,我们将详细了解大多数应用程序常见的三种不同类型的网络交互。您将了解每种类型的驱动因素,以及用于有效管理这些交互的现代技术和 API。