使用无线装置传输数据可能是应用最主要的耗电来源之一。为了最大限度地减少与网络活动相关的电池耗电量,您必须了解连接模型对底层无线装置硬件的影响。
本部分将介绍无线电状态机,并说明应用连接模型如何与其交互。然后,它提供了几种技术,如果遵循这些技术,将有助于最大限度地减少应用的数据消耗对电池的影响。
无线装置状态机
用户设备上的无线电具有内置节能功能,有助于最大限度地减少其消耗的电池电量。当无线装置处于完全活跃状态时,会消耗大量电量,但当其处于非活跃状态或待机状态时,消耗的电量非常少。
需要记住的一个重要因素是,无线装置无法瞬间从待机状态切换到完全活跃状态。“启动”无线装置会产生延迟。因此,电池会缓慢地从高能耗状态过渡到低能耗状态,以便在不使用时节省电量,同时尽量减少与“启动”无线装置相关的延迟。
典型 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 次、每次持续 1 秒的传输操作的相对无线电耗电量。该图不包括运行之间的“启动”延迟时间。
相比之下,如果同一应用捆绑其数据传输,每分钟运行一次持续 3 秒的传输,则每分钟内无线装置处于高功率状态的总时间仅为 20 秒。这样一来,无线装置在每分钟内有 40 秒的时间处于待机状态,从而显著降低电池消耗。
图 3. 每分钟运行一次、每次传输 3 秒的无线电相对耗电量。
优化技巧
现在,您已了解网络访问对电池续航时间的影响,接下来我们来讨论一下您可以采取哪些措施来帮助减少电池耗电,同时提供快速流畅的用户体验。
捆绑数据传输
如上一部分所述,捆绑数据传输,以便以较低的频率传输更多数据,是提高电池效率的最佳方法之一。
当然,如果您的应用需要立即接收或发送数据以响应用户操作,则不一定能做到这一点。您可以通过预测和预提取数据来缓解此问题。其他场景(例如向服务器发送日志或分析数据,以及其他由应用发起的非紧急数据传输)非常适合进行批处理和捆绑。如需了解有关调度后台网络传输的提示,请参阅优化应用发起的任务。
预取数据
预提取数据是减少应用运行的独立数据传输会话数量的另一种有效方法。借助预提取,当用户在您的应用中执行操作时,应用会预测后续一系列用户操作最可能需要哪些数据,并在单次连接中以最大容量一次性获取这些数据。
通过预先加载传输,您可以减少下载数据所需的无线装置激活次数。这样,您不仅可以延长电池续航时间,还可以缩短延迟时间、降低所需带宽并缩短下载时间。
预提取还可最大限度地减少因等待下载完成才能执行操作或查看数据而导致的应用内延迟,从而提升用户体验。
下面是一个实际示例。
新闻阅读器
许多新闻应用都会尝试通过以下方式来减少带宽:仅在选择类别后才下载标题,仅在用户想要阅读时才下载完整文章,以及仅在缩略图滚动到视图中时才下载缩略图。
使用这种方法时,当用户滚动浏览标题、更改类别和阅读文章时,无线装置在用户阅读新闻的大部分时间里都必须保持活跃状态。不仅如此,在切换类别或阅读文章时,能量状态之间的不断切换会导致明显的延迟。
更好的方法是在启动时预提取合理数量的数据,从第一组新闻标题和缩略图开始(确保启动时间较短),然后继续预提取其余标题和缩略图,以及至少在主标题列表中提供的每篇文章的文本。
另一种方法是预提取每个标题、缩略图、文章文本,甚至可能是完整的文章图片,通常在后台按预定时间表进行。这种方法可能会消耗大量带宽和电池续航时间来下载从不使用的内容,因此应谨慎实施。
其他注意事项
虽然预提取数据有很多好处,但如果使用过于激进,预提取也会带来风险,即下载未使用的数据会增加电池消耗和带宽使用量,以及下载配额。此外,请务必确保预提取不会导致应用在等待预提取完成时延迟启动。在实际操作中,这可能意味着逐步处理数据,或启动连续传输并设置优先级,以便优先下载和处理应用启动所需的数据。
预提取数据的激进程度取决于要下载的数据的大小以及使用该数据的可能性。根据前面介绍的状态机,作为粗略的指导,对于在当前用户会话中有 50% 的几率会被使用的数据,您通常可以预提取大约 6 秒(大约 1-2 MB)的数据,然后下载未使用数据的潜在费用才会与不下载这些数据的潜在节省费用相匹配。
一般来说,最好预提取数据,这样您只需每 2 到 5 分钟启动一次下载,下载量大约为 1 到 5 兆字节。
根据此原则,大型下载内容(例如视频文件)应定期(每 2 到 5 分钟)分块下载,从而仅有效预提取可能在接下来几分钟内观看的视频数据。
一种解决方案是,将完整下载安排在仅连接到 Wi-Fi 时进行,并且可能仅在设备充电时进行。WorkManager API 正好支持此用例,可让您限制后台工作,直到设备满足开发者指定的条件(例如正在充电且已连接到 Wi-Fi)。
在发出请求之前检查连接情况
搜索手机信号是移动设备上最耗电的操作之一。对于用户发起的请求,最佳实践是先使用 ConnectivityManager 检查连接,如监控网络连接状态和网络连接计量中所述。如果没有网络,应用可以不强制移动无线装置进行搜索,从而节省电池电量。然后,系统可以安排该请求,并在建立连接后与其他请求一起批量执行。
池连接
除了批处理和预提取之外,还有一种策略可以提供帮助,那就是将应用的各种网络连接汇集在一起。
重复使用现有网络连接通常比发起新连接更高效。重复使用连接还可让网络更智能地应对拥塞和相关的网络数据问题。
HttpURLConnection 和大多数 HTTP 客户端(例如 OkHttp)默认启用连接池,并为多个请求重复使用同一连接。
回顾与展望
在本部分中,您了解了许多有关无线电的信息,以及一些可以广泛应用的策略,这些策略可提供快速、响应迅速的用户体验,同时减少电池消耗。
在下一部分中,我们将详细介绍大多数应用中常见的三种不同类型的网络交互。您将了解每种类型的驱动因素,以及用于高效管理这些互动的现代技术和 API。