[Android Traffic] 让android应用在传输网络数据的时候更省电

简介:

  到今年6月,我国的手机网民已经达到了3.88亿,超过了电脑终端。相信有智能机的同学都用过手机上网冲浪。但是手机的电量很快被用光了恐怕是每个人都不能忍受的一件事情。而打开数据连接进行网络数据的传输是很耗费电量的,如果用户发现你的应用榨干了他电池里的电,恐怕他会第一时间将你的应用给卸载掉。所以进行网络应用的开发理解怎样才能更省电就很有必要了。

         
        如果数据连接一直保持着激活的状态,那么它的耗电量是很惊人的,所以手机会在网络空闲的情况下自动休眠数据连接来达到省电的目的。以3G网络来举例,它有三个不同的状态:
 
        Full power: 全力工作,网络信号和电量的消耗都很高。
        Low power:耗电量是Full power的一半,当然信号也差一些。
        Standby: 耗电量很少,相当于休眠了。
   
        手机会根据当前网络的使用情况来进行状态的切换,如下图所示,这就是无线网络的状态机。当处于Full Power状态空闲5秒后就会进入到Low Power状态,如果还空闲12秒则进入到Standby状态。而从Standby状态重新切换到Full Power状态则需要2秒的延迟,从Low Power状态则需要1.5秒。理解这个状态机就可以很好地理解怎么在传输网络数据的时候更省电。
 
          
        比如说我们现在有3秒的数据要进行传输。一种策略是每隔18秒传输1秒,第二种则是将这3秒的数据一下子传完。让我们来分析一下这两种策略是如果影响状态机以及它们的耗电情况是怎么样的。
      
        第一种: 传输1秒加上等待的5秒,处于Full Power状态为6秒。传输3次,总共为18秒。另外每次处于Low power状态等待的12秒加上1.5秒的延迟,传输3次就为(12+1.5)×3=40.5秒。
        第二种:传输3秒加上等待的5秒,处于Full Power状态为8秒,然后在Low Power状态等待12秒后进入到StandBy状态。
 
        经过分析,将耗电情况画成饼图就如下图所示。我们可以很清楚地看到采用第二种策略要比第一种策略省电得多。这其实就是打包传输数据的思想,也就是说将很多零散紧凑地数据传输打成一个包来一次性地传输可以节省很多的电量。
  
 
         另外我们还要尽可能地减少网络连接的数量。因为每新建一个网络连接都要比你利用当前已经存在的网络连接所耗费的资源和电量多。所以如果现在有可以重复利用的网络连接,我们要优先利用这些连接而不要去新建连接。和前面所说的打包思想类似地就是如果有很多连接请求,我们也可以将这些请求打成包放在一个请求中,这样我们就需要一个网络连接就可以了。
 
       还有一种减少网络连接数量的方法就是当连接不用的时候不要等到它超时,而要自己主动关闭。但这可能跟前面所说的网络连接复用有冲突之处。解决的办法就是用完后不是马上关闭连接,等待一段时间(当然要在超时前)如果还没有用到的话再关闭这个连接。
 
       Prefetch Data也是一种省电的有效的策略。以一个看新闻的应用为例,如果有10条新闻,当用户看第一条的时候我们就可以一下子把这10条新闻都取过来,也是一种类似打包的策略。这种策略有如下的优点:
       
        降低了激活网络的次数,也就减少了状态机切换时等待所浪费的电量。
        提高了用户体验,用户在打开下面的新闻的时候就不需要再等待数据传输的过程了,可以立即打开,响应速度可以很快。
 
        但是过犹不及,如果这种策略使用得太过了的话也会带来风险,反而可能会加大了程序的耗电量,还会消耗掉用户的流量。至于到底要用到什么程度要看实际的情况,一般来讲可以采用"四舍五入”的方式即用户如果有50%的可能性会用到这些数据就可以将其Prefetch。相信大家都有在网上看过在线视频,当你看到10分钟的时候,视频可能已经下到20分钟了,然后就不再下载了,直到你看到如18分钟的时候,视频再下载10分钟的内容到缓存。这其实也可以看作是一种Prefetch Data的应用。
   
      在android 4.0.4的sdk DDMS中,有了一个工具:Network Traffic Tool 。通过这个工具可以实时地监测网络的使用情况,使程序员更好的发现自己的应用程序在什么时候发送接收了多少的网络数据,从而来改进自己的应用程序来达到省电的目的。
 
       如果要更加清楚地看清每一个网络连接的使用情况可以在程序中对网络连接打tag,如对socket连接可以这样:

点击(此处)折叠或打开

   TrafficStats.setThreadStatsTag(0xF00D);

  TrafficStats.tagSocket(outputSocket);

  // Transfer data using socket

  TrafficStats.untagSocket(outputSocket);

 

       对于Apache HttpClient and URLConnection 会自动打上tag,所以只要设置上tag名就可以了:

点击(此处)折叠或打开

  TrafficStats.setThreadStatsTag(0xF00D);

  try {

     // Make network request using HttpClient.execute()

  } finally {

     TrafficStats.clearThreadStatsTag();

  }

        下图即我在为一个httpClient打上tag后得到的网络使用情况,系统用红色做出标示区分开来:
   
 

       另外一个可能会很耗电的方面就是应用程序的更新。应用的更新主要是有两种,分别是:

 
       Polling:周期性地连接服务器来请求数据。这样对于使用3G网络的手机来说,程序每请求一次就会将手机网络的状态机置于高耗电状态20秒左右的时间,累积起来所浪费的电量也是很客观的。不推荐使用这种方式。
  
       Google Cloud Messaging: 是google的一种轻量级的实现,可以让服务器将更新的内容push到目标手机上。相比于Polling,可以省更多的电,所以推荐使用这种方式。
 
        手机在下载数据时候会将状态机一直处于Full Power状态,长时间地下载会很快把电池中的电用光。所以从这个方面考虑省电的话就要减少下载量。这个和前面所讲到的Prefetch Data并不矛盾,我们所要减少的就是减少不必要的下载。如下载一个很大的图片的时候,可以在服务器端将图片做一下处理,减少图片的大小,然后我们再下载。另外就是可以缓存会经常用到的数据到本地,减少这种重复的下载而且还可以提高用户的体验。
 
        最后非常重要的一点就是要根据实时的网络连接情况来更改连接网络的方式。比如说现在wifi打开了,那我们的应用程序就不应该再继续使用3G网络了,而要切换到wifi来。因为wifi可以在较小的耗电量下以一个较高的带宽下载大量的数据。除去wifi,对于数据连接来讲,速度越快,耗电量就越高,有如下规律:LET>3G>2G。所以在同样的时间里,高速网络等待状态机转换的过程中耗的电就更多了。所以在较好的网络情况下可以考虑更“过”的使用Prefetch Data策略。
 
 
        更多详细的内容请查看google的官方文档: http://developer.android.com/training/efficient-downloads/index.html 
分类:  Android Traffic
本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/4324401.html如需转载请自行联系原作者

demoblog
相关文章
|
20天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
3天前
|
机器学习/深度学习 搜索推荐 知识图谱
图神经网络加持,突破传统推荐系统局限!北大港大联合提出SelfGNN:有效降低信息过载与数据噪声影响
【7月更文挑战第22天】北大港大联手打造SelfGNN,一种结合图神经网络与自监督学习的推荐系统,专攻信息过载及数据噪声难题。SelfGNN通过短期图捕获实时用户兴趣,利用自增强学习提升模型鲁棒性,实现多时间尺度动态行为建模,大幅优化推荐准确度与时效性。经四大真实数据集测试,SelfGNN在准确性和抗噪能力上超越现有模型。尽管如此,高计算复杂度及对图构建质量的依赖仍是待克服挑战。[详细论文](https://arxiv.org/abs/2405.20878)。
13 5
|
11天前
|
机器学习/深度学习 算法 数据挖掘
基于改进K-means的网络数据聚类算法matlab仿真
**摘要:** K-means聚类算法分析,利用MATLAB2022a进行实现。算法基于最小化误差平方和,优点在于简单快速,适合大数据集,但易受初始值影响。文中探讨了该依赖性并通过实验展示了随机初始值对结果的敏感性。针对传统算法的局限,提出改进版解决孤点影响和K值选择问题。代码中遍历不同K值,计算距离代价,寻找最优聚类数。最终应用改进后的K-means进行聚类分析。
|
10天前
|
SQL 安全 算法
网络安全与信息安全:保护数据的关键策略
【7月更文挑战第17天】在数字化时代的浪潮中,网络安全和信息安全的重要性日益凸显。本文将深入探讨网络安全漏洞的成因、影响以及防范措施,同时分析加密技术在保障信息传输安全中的应用,并强调提高个人与企业的安全意识在防御网络威胁中的核心作用。文章旨在为读者提供全面的网络安全知识框架,帮助构建更为坚固的防护墙,确保数据资产的安全。
|
13天前
|
机器学习/深度学习 PyTorch 算法框架/工具
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
|
9天前
|
安全 Java Android开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
【7月更文挑战第18天】在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文将深入探讨这两个平台在开发过程中的主要差异,包括编程语言、用户界面设计、性能优化、安全性以及市场策略等方面。通过比较分析,旨在为开发者提供决策支持,帮助他们选择最适合自己项目需求的平台,同时考虑到用户体验和市场需求的变化,为未来的应用开发指明方向。
|
17天前
|
开发者 Kotlin Android开发
Kotlin协程在Android开发中的应用
【7月更文挑战第10天】Kotlin协程简化了Android异步编程,提供轻量级并发。挂起函数让异步代码看起来同步,不阻塞线程,便于管理。在项目中,添加Kotlin和协程依赖,如`kotlinx.coroutines-core`和`kotlinx-coroutines-android`。使用`CoroutineScope`和`launch`处理耗时任务,如网络请求,避免主线程阻塞。挂起函数和调度器控制执行上下文,适应不同任务需求。
|
11天前
|
JSON 数据挖掘 API
在会议系统工程中,Python可以用于多种任务,如网络请求(用于视频会议的连接和会议数据的传输)、数据分析(用于分析会议参与者的行为或会议效果)等。
在会议系统工程中,Python可以用于多种任务,如网络请求(用于视频会议的连接和会议数据的传输)、数据分析(用于分析会议参与者的行为或会议效果)等。
|
数据采集 Android开发 索引
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(二)
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(二)
511 0
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(二)
|
数据采集 存储 传感器
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(一)
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(一)
249 0
【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )(一)