最近有一个项目需要对android设备上安装的应用进行流量统计,并且分离出每个应用通过wifi和手机网络分别用了多少流量。花了一些时间查阅资料和代码编写,终于完成了一个DEMO版本,最后做了一些封装,将这个功能组件化,以后需要这个功能只要把jar导进去就可以了。那么,对于这一个需求,我们应该怎么做呢?
谈到流量统计,先给大家介绍篇入门文章http://keepcleargas.bitbucket.org/2013/10/12/android-App-Traffic.html,这篇文章详细阐述了在android文件系统中,关于安装应用的流量统计文件位置,以及如何看这个文件。另外,文章还介绍了单个应用的流量统计文件位置。这里,文章谈到了TrafficStats这个类。TrafficStats是android.net包下的一个工具类,里面有一些静态方法,可以用来获取应用的流量使用情况。值得注意的是,所有获得的值都是从开机到当前时刻的流量值,这一点很重要。因此,我们在做统计的是后,就需要用到数据库,在手机关机的时候,先把值持久化下来。接下来,我们重点看TrafficStats这个类的其中两个静态方法getUidRxBytes(int uid)和getUidTxBytes(int uid)。这两个方法分别获取相应uid所代表的应用的流量接收字节数和流量发送字节数。而,应用的uid我们可以通过应用的包名得到PackageInfo,在从PackageInfo中提取它的uid。我们只要将得到的rx和tx相加就得到应用使用的流量了。
通过上面的方法,我们只能得到应用所使用的总流量。但是,如何分离出其中有多少是通过wifi使用的,多少是通过手机网络的呢?这里,我们需要借助android的广播机制。通过监听手机的wifi切换情况,当wifi从关闭状态切换到开启状态时,就开始统计wifi流量;当wifi从开启状态切换到关闭状态时,就结束wifi流量统计;另外,上面已经提到,我们用TrafficStats得到的流量值是用户开机到当前的流量统计值。因此,我们还需要另一个广播来监听用户手机的关机。
看起来,原理很简单,但是里面有许多细节需要我们考虑:
- 用户安装了使用流量统计功能的应用之前,其他需要统计流量的应用已经有流量统计值了,我们是无法分离出之前这部分的wifi和手机网络流量值的。我们要将这部分去除。也就是说,从安装我们的功能应用是开始统计。
最后贴一些我的组件下载地址:http://download.csdn.net/detail/hatah0126/6611873。由于我们的组件需要数据库来存储,因此还依赖了另一个jar:http://download.csdn.net/detail/hatah0126/6611911。使用时,把这两个jar放到libs目录下。另外,在eclipse的java Build Path->order and Export中,记得把他们勾上,新版的eclipse如果没勾的话会出问题。
最最后一步,就是在我们项目的AndroidManifest.xml上做一些权限和广播的配置即可,将下面的代码贴到你的AndroidManifest.xml。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<receiver android:name="cn.wth.trafic.receiver.DeviceShutDownReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.ACTION_SHUTDOWN"/>
</intent-filter>
</receiver>
<receiver android:name="cn.wth.trafic.receiver.WifiStateReceiver">
<intent-filter >
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
</intent-filter>
</receiver>
来源:oschina
链接:https://my.oschina.net/u/990810/blog/178988