优化网络访问

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

本节介绍无线电状态机,并解释应用的连接模型如何与之交互。然后提供了一些技巧,遵循这些技巧有助于最大程度地减少应用数据消耗对电池的影响。

无线电状态机

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

需要注意的重要一点是,无线电无法立即从待机状态切换到完全激活状态。与“启动”无线电相关的延迟期。因此,电池从较高能耗状态到较低能耗状态的转换速度较慢,以便在不使用时节省电量,同时试图最大程度地减少与“启动”无线电相关的延迟。

典型 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。