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