如何高效优化Android网络连接以降低电耗

来源:互联网 发布:127.0.0.1 linux 编辑:程序博客网 时间:2024/06/05 19:59

在开发android应用时应最大限度地减少下载和网络连接的电池寿命影响。

一、高效的连接优化下载
应用的影响:
无线电的状态机由三种能量状态组成:
1、全功率:当连接激活时使用,允许设备以最高的速率传输数据。
2、低功耗:在完全状态下使用大约50%的电池电量的中间状态。
3、待机:没有网络连接活动或需要的最小能量状态

虽然低电平和空闲状态会大大减少电池电量,但它们也会对网络请求造成很大的延迟。从低状态恢复到全功率需要大约1.5秒,而从空闲状态转为满状态可能需要2秒钟以上。

在应用中每次创建新的网络连接时,无线电转换到全功率状态。每18秒传输1分钟的无捆绑数据,将使无线电无线电永久活跃,使其恢复到高功率,就像它即将闲置一样。结果,每分钟,它将在高功率状态下消耗电池18秒,在低功率状态下消耗剩余的42秒。
相比之下,捆绑每分钟3秒传输的相同应用程序将使收音机处于高功率状态只有8秒钟,并将其仅保持在低功率状态仅需12秒。

预取数据

预取数据是减少独立数据传输会话数量的有效方式。通过预取功能,您可以通过单个连接以满容量在单个突发中下载您可能需要的给定时间段内的所有数据。
一般来说,预取数据是一个很好的做法,因此您只需要每2到5分钟启动另一次下载,即1到5兆的顺序。
按照这个原则,大量的下载(例如视频文件)应该以固定的时间间隔(每2到5分钟)以大块的形式下载,只需要在几分钟之内只获取可能被浏览的视频数据。

音乐播放器除了正在播放的歌曲之外,更好的方法是保持一首歌曲的缓冲区。对于流式音乐而言,不是始终保持使无线电处于活动状态的连续流,而是考虑使用HTTP直播流以突发方式传输音频流

许多新闻应用程序只有在选择了类别后才能尝试降低带宽,只有当用户想要阅读这些新闻时,才能阅读完整的文章,以及在滚动浏览时缩略图。用这种方法,无线电将被迫保持活跃
更好的方法是在启动时预先获取合理数量的数据,从第一组新闻头条和缩略图开始 - 确保低延迟启动时间,并继续其余的标题和缩略图,以及每个文章的文章至少可以从主标题列表中获得文章。

减少连接
重用现有网络连接通常比启动新网络连接更有效。重用连接还允许网络更智能地对拥塞和相关网络数据问题做出反应。不要同时创建多个连接下载数据,或连接多个连续的get请求,最好绑定在一个get中。
过早关闭连接可能会阻止它重新使用,这需要额外的开销来建立新的连接。一个有用的妥协不是立即关闭连接,而是在固有超时到期之前仍然关闭连接。

使用DDMS之类网络流量工具
Android DDMS(Dalvik Debug Monitor Server)包含一个“详细网络使用情况”选项卡,可以跟踪您的应用程序何时进行网络请求。使用此工具,您可以监控应用程序如何以及何时转移数据并适当地优化底层代码。
通过监控数据传输的频率以及每个连接期间传输的数据量,您可以确定应用程序可以使电池更有效率的区域。一般来说,您将会寻找可能被推迟的短尖峰,或者导致稍后的转移被抢占。

二、最小化定时更新带来的影响
定期更新的最佳频率将根据设备状态,网络连接性,用户行为和显式用户偏好而有所不同。

使用云设备消息传递替代轮询

每次您的应用程序轮询您的服务器以检查是否需要更新时,您可以在典型的3G连接上激活无线电,不必要地抽取电源长达20秒。
Android Cloud to Device Messaging(C2DM)是一种用于将数据从服务器传输到特定应用程序实例的轻量级机制。使用C2DM,您的服务器可以通知在特定设备上运行的应用程序有新的数据可用。
与轮询相比,您的应用程序必须定期ping服务器以查询新数据,这种事件驱动模式允许您的应用程序仅在知道有数据下载时创建新连接。

三、减少多余数据下载

本地缓存
避免下载重复的数据。您可以通过积极的缓存来执行此操作。始终缓存静态资源,包括按需下载,如全尺寸图像,只要合理可能。应该单独存储按需资源,以便您定期刷新按需缓存以管理其大小。
为确保您的缓存不会导致您的应用程序显示陈旧的数据,请务必从HTTP响应标头中提取所请求内容上次更新的时间,以及何时到期。这将允许您确定何时刷新相关内容。
卸载程序时应及时清除缓存文件。

HttpURLConnection Response缓存
Android 中有一个响应缓存HttpURLConnection。您可以使用反射在支持的设备上启用HTTP响应缓存。

private void enableHttpResponseCache() {  try {    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB    File httpCacheDir = new File(getCacheDir(), "http");    Class.forName("android.net.http.HttpResponseCache")         .getMethod("install", File.class, long.class)         .invoke(null, httpCacheDir, httpCacheSize);  } catch (Exception httpResponseCacheNotAvailable) {    Log.d(TAG, "HTTP response cache is unavailable.");  }}

安装缓存后,可以直接从本地存储提供完全缓存的HTTP请求,从而无需打开网络连接。有条件缓存的响应可以从服务器验证其新鲜度,从而消除与下载相关的带宽成本。

四、根据连接类型修改下载模式

当涉及到电池寿命的影响时,并不是所有的连接类型都是相等的。Wi-Fi无线电使用的电池比无线电无线电相当少。

Wi-Fi
Wi-Fi无线电将以显着降低的电池成本提供更大的带宽。因此,在wifi连接时尽量做数据传输操作。

更大的带宽可以更少的下载更多的数据
通过无线电连接时,较高的带宽通常以较高的电池成本为代价。也会导致会话期间下载更大的数据量。
您可以使用连接管理器确定活动的无线电广播,并相应地修改您的预取例程:

ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);TelephonyManager tm =  (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);NetworkInfo activeNetwork = cm.getActiveNetworkInfo();int PrefetchCacheSize = DEFAULT_PREFETCH_CACHE;switch (activeNetwork.getType()) {  case (ConnectivityManager.TYPE_WIFI):     PrefetchCacheSize = MAX_PREFETCH_CACHE; break;  case (ConnectivityManager.TYPE_MOBILE): {    switch (tm.getNetworkType()) {      case (TelephonyManager.NETWORK_TYPE_LTE |             TelephonyManager.NETWORK_TYPE_HSPAP):         PrefetchCacheSize *= 4;        break;      case (TelephonyManager.NETWORK_TYPE_EDGE |             TelephonyManager.NETWORK_TYPE_GPRS):         PrefetchCacheSize /= 2;        break;      default: break;    }    break;  }  default: break;}