优化网络访问

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

本部分介绍了无线装置状态机,并说明了应用的连接模型如何与之交互。然后介绍了几种方法,遵循这些方法有助于最大限度地降低应用消耗电量对电池的影响。

无线装置状态机

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

需要记住的一个重要因素是,无线装置无法即时从待机状态切换到完全活跃状态。有一个与“接通无线装置”相关的延迟期。因此,电池从高能量状态缓慢转换为低能量状态,以便在不使用时节省电量,同时尽量减少与无线装置“接通电源”相关的延迟时间。

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

  • 全功率:在连接处于活动状态时使用,允许设备以尽可能高的速率传输数据。
  • 低功耗:耗电量降低约 50% 的中间状态。
  • 待机:耗电量最低的状态,在此期间没有网络连接处于活动状态。

虽然低功率和待机状态消耗的电量明显减少,但它们也会给网络请求带来明显的延迟。从低功率状态返回到全功率大约需要 1.5 秒,而从待机切换到全功率可能需要 2 秒以上。

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


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

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

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

此方法对于典型的移动网络浏览特别有效,因为它可以防止用户浏览网页时出现不受欢迎的延迟。相对较短的尾时间还可确保浏览会话结束后,无线装置可以切换到较低的能量状态。

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

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

每次创建新的网络连接时,无线装置都会转换为全功率状态。对于前面介绍的典型 3G 无线装置状态机,它将在传输期间(加上额外 5 秒的尾时间)保持全功率状态,接着处于低能量状态 12 秒。因此,对于典型的 3G 设备,每个数据传输会话都会导致无线装置消耗能量至少 18 秒。

在实践中,这意味着一个进行 1 秒数据传输(每分钟进行三次)的应用将使无线装置永久保持活跃状态,并在进入待机模式时将其移回高功率。


图 2. 每分钟运行 3 次的相对无线装置功耗。该图不包括两次运行之间的“启动”延迟时间。

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


图 3. 每分钟运行一次的三秒传输的相对无线装置功耗。

优化技巧

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

捆绑数据传输

如上一部分所述,捆绑数据传输以减少传输更多数据是提高电池效率的最佳方法之一。

当然,如果您的应用需要立即接收或发送数据以响应用户操作,这并非总能实现。您可以通过预期并预取数据来缓解这种情况。其他场景(例如将日志或分析数据发送到服务器以及应用发起的其他非紧急的数据传输)非常适合批量和捆绑。如需了解有关调度后台网络传输的提示,请参阅优化应用启动的任务

预先抓取数据

预取数据是减少应用运行的独立数据传输会话数量的另一种有效方法。通过预取,当用户在您的应用中执行操作时,应用会预测下一系列用户操作最有可能需要哪些数据,并通过单个连接以满容量容量一次突发请求提取这些数据。

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

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

下面是一个实际示例。

新闻阅读器

许多新闻应用都尝试通过以下方式降低带宽:仅在用户选择某个类别后下载标题;仅在用户想要阅读完整报道时下载完整报道;仅在用户滚动进入视图时下载缩略图。

使用此方法,无线装置在大多数用户的新闻阅读会话中会保持活动状态,因为用户会滚动标题、更改类别和阅读报道。不仅如此,在能量状态之间切换时,会导致在切换类别或阅读文章时产生严重延迟。

更好的方法是在启动时预取适量的数据,从第一组新闻标题和缩略图开始(确保低延迟的启动时间),然后继续预取剩余的标题和缩略图,以及每篇报道的报道文本(至少可从主要标题列表中找到)。

另一种替代方案是预取每个标题、缩略图、文章文本,甚至可能是完整的文章图片 - 通常按照预定的时间表在后台运行。这种方法可能会花费大量带宽和电池续航时间下载从未使用过的内容,因此应谨慎实施。

其他注意事项

虽然预提取数据有很多好处,但过于积极地预提取还会带来因下载未使用的数据而增加耗电量和带宽使用量(以及下载配额)的风险。此外,还必须确保预提取不会在应用等待预提取完成时延迟应用启动。实际上,这可能意味着逐步处理数据,或按优先级启动连续传输,以便首先下载和处理应用启动所需的数据。

预取数据的积极程度取决于要下载的数据的大小及其使用的可能性。作为粗略指南,根据前面描述的状态机,对于在当前用户会话中使用概率为 50% 的数据,您通常可以预取大约 6 秒(大约 1-2 MB),之后下载未使用数据的潜在成本与不下载该数据可能节省的费用相等。

一般来说,预取数据是一种很好的做法,这样您只需每 2 到 5 分钟启动一次下载(按 1 到 5 MB 的顺序即可)。

遵循这一原则,下载大量内容(如视频文件)时,应定期(每 2 到 5 分钟)分块下载,从而有效地仅预取接下来几分钟内可能观看的视频数据。

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

在发出请求前检查连接情况

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

池连接

除了批处理和预提取之外,另一个有用的策略是汇集应用的网络连接。

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

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

回顾及展望未来

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

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