优化网络访问

使用无线装置传输数据可能是导致应用出现过度耗电问题的最重要的根源之一。为了最大限度地减轻与网络活动相关的过度耗电问题,您务必要了解连接模式会如何影响底层无线装置硬件。

本部分介绍了无线装置状态机,并说明了应用的连接模式如何与此状态机进行交互。然后,它会提供多种技巧,遵循这些技巧有助于最大限度地减少应用的数据消耗对电池的影响。

无线装置状态机

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

需要记住的一个重要因素是,无线装置无法从待机状态立即变为完全活动状态。与“启动”无线装置相关联的延迟时间。因此,电池会缓慢地从高能耗状态转换到低能耗状态,以便在不使用时节省电量,同时尝试最大限度地缩短与为无线装置“接通电源”相关的延迟。

典型 3G 网络无线装置的状态机包含 3 种能量状态:

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

虽然低功率和待机状态所消耗的电池电量明显减少,但它们也会导致网络请求严重延迟。从低功率状态返回满功率状态需要大约 1.5 秒,而从待机状态切换到满功率状态需要大约 2 秒。

为了最大限度地缩短延迟,状态机利用延迟来推迟向低能量状态的转换。图 1 使用的是 AT&T 的典型 3G 无线装置的时间设置。


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

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

本页根据 AT&T 提供的数据介绍了典型的 3G 无线装置的代表性状态机。不过,一般原则和对应的最佳实践适用于所有无线装置实现。

这种方法对典型的移动网络浏览活动尤为有效,因为它可以在用户浏览网页时阻止出现意外的延迟。相对较短的拖尾时间还可以确保在浏览会话结束后,无线装置可以立即切换到低能量状态。

遗憾的是,这种方法可能会导致在 Android 等现代智能手机操作系统上运行的应用效率低下,因为应用既在前台运行(此时降低延迟很重要),又在后台运行(此时应优先考虑电池续航时间)。

应用会如何影响无线装置状态机

每次您创建新的网络连接时,无线装置都会转换为满功率状态。如果是上述典型 3G 无线装置状态机,它会在传输期间以及额外 5 秒的拖尾时间内始终保持满功率状态,并在随后的 12 秒内保持低能量状态。因此,对于典型的 3G 设备,每个数据传输会话都会导致无线装置消耗能量至少 18 秒。

在实践中,如果某个应用每分钟进行 3 次数据传输并持续 1 秒,就会导致无线装置在即将进入待机模式时重新切换回高功率状态,进而永久保持活动状态。


图 2. 每分钟运行三次的一秒传输的无线装置耗电量对比情况。该图不包括运行之间的“启动”延迟时间。

相比之下,如果同一款应用整合其数据传输,每分钟运行一次 3 秒的传输,则无线装置每分钟保持高功率状态的总时间仅为 20 秒。这样一来,无线装置每分钟有 40 秒时间处于待机状态,从而大大减少电池耗电量。


图 3. 每分钟运行一次的三秒传输的无线装置耗电量对比情况。

优化技巧

现在,您已经了解网络访问如何影响电池续航时间,接下来我们来讨论一下您可以采取哪些措施来帮助减少耗电量,同时提供快速流畅的用户体验。

捆绑数据转移

如上一部分所述,整合数据传输,以便您更少地传输更多数据,是提高电池效率的最佳方法之一。

当然,如果您的应用需要立即接收或发送数据以响应用户操作,则可能无法始终做到这一点。您可以通过预测和预提取数据来缓解此问题。其他场景(例如向服务器发送日志或分析数据,以及其他非紧急的应用发起的数据传输)非常适合采用批处理和捆绑。如需有关安排后台网络传输的提示,请参阅优化应用发起的任务

预先抓取数据

预取数据是减少应用运行的独立数据传输会话数量的另一种有效方法。预取意味着,当用户在您的应用中执行某项操作时,应用会预测下一系列用户操作最有可能需要哪些数据,并通过单个连接满负荷地在单个爆发期中获取这些数据。

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

预先抓取还可以最大限度地缩短因在执行某项操作或查看数据之前等待下载完成而导致的应用内延迟,从而改进用户体验。

下面是一个实际示例。

新闻阅读器

许多新闻应用都仅在用户选择某个类别后才下载标题、仅当用户想要阅读时才下载完整报道,并在用户滚动到视图中后立即下载缩略图,试图通过这种方式降低带宽。

如果使用这种方法,无线装置会在用户的新闻阅读会话的大部分时间内保持活动状态,因为用户会滚动浏览标题、更改类别并阅读报道。不仅如此,在各能量状态之间持续切换还会导致在切换类别或阅读报道时出现严重的延迟。

更好的方法是在启动时预提取合理数量的数据,首先是第一组新闻标题和缩略图,确保启动延迟时间较短,然后继续提取剩余的标题和缩略图,以及至少从主要标题列表中获取的每篇文章的文章文本。

另一种替代方案是预先抓取每个标题、缩略图、报道正文,甚至可能是完整的报道图片(通常是按照预定的时间表在后台进行)。这种方法的风险是花费大量带宽和电池续航时间下载从未使用的内容,因此实现时应该谨慎。

其他注意事项

虽然预先抓取数据有很多好处,但如果使用过于激进,预先抓取可能会因下载未使用的数据而产生过度耗电问题加剧和带宽使用量增加的风险。此外,还要确保预先抓取不会在应用等待预先抓取完成时导致应用启动出现延迟。实际上,这可能意味着要逐步处理数据,或按优先级启动连续传输,以便优先下载和处理应用启动所需的数据。

预先抓取数据的积极程度取决于要下载的数据大小以及使用这些数据的可能性。根据前面所述的状态机,大致来说,对于在当前用户会话中被使用的几率为 50% 的数据,您通常可以预提取大约 6 秒(约 1-2 兆字节)的数据,这样一来,下载未使用数据的潜在成本与一开始不下载该数据的潜在节省相匹配。

一般来说,建议按照以下形式预先抓取数据:每 2 到 5 分钟启动一次下载、每次下载 1 到 5 兆字节的数据。

按照这一原则,大型下载内容(例如视频文件)应该分段定期(每 2 到 5 分钟)下载,从而仅预先抓取用户在接下来的几分钟内可能会观看的视频数据。

一种解决方案是仅在连接到 Wi-Fi 时(并且可能仅在设备充电时)才安排完整下载。WorkManager API 正好支持此用例,允许您限制后台工作,直到设备满足开发者指定的条件(例如正在充电和已连接到 Wi-Fi)。

在发出请求之前检查连接性

搜索手机信号是移动设备上最耗电的操作之一。对于用户发起的请求,最佳做法是先使用 ConnectivityManager 检查连接,如监控连接状态和连接计量中所述。如果没有网络,该应用不会强制移动无线装置进行搜索,因此可以节省电量。然后,当建立连接时,该请求可以与其他请求一起批量安排和执行。

连接池

除了批处理和预提取之外,还有一种有助于提高效率的策略,那就是汇集应用的网络连接。

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

HttpURLConnection 和大多数 HTTP 客户端(例如 OkHttp)默认启用连接池,并为多个请求重复使用同一连接。

回顾与展望

在本部分中,您详细了解了无线电,以及一些可广泛应用以提供快速、响应迅速的用户体验同时减少电池消耗的策略。

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