最近有一个项目须要对android设备上安装的应用进行流量统计,而且分离出每一个应用经过wifi和手机网络分别用了多少流量。花了一些时间查阅资料和代码编写,终于完成了一个DEMO版本,最后作了一些封装,将这个功能组件化,之后须要这个功能只要把jar导进去就能够了。那么,对于这一个需求,咱们应该怎么作呢? html
谈到流量统计,先给你们介绍篇入门文章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相加就获得应用使用的流量了。 java
经过上面的方法,咱们只能获得应用所使用的总流量。可是,如何分离出其中有多少是经过wifi使用的,多少是经过手机网络的呢?这里,咱们须要借助android的广播机制。经过监听手机的wifi切换状况,当wifi从关闭状态切换到开启状态时,就开始统计wifi流量;当wifi从开启状态切换到关闭状态时,就结束wifi流量统计;另外,上面已经提到,咱们用TrafficStats获得的流量值是用户开机到当前的流量统计值。所以,咱们还须要另外一个广播来监听用户手机的关机。 android
看起来,原理很简单,可是里面有许多细节须要咱们考虑: 数据库
最后贴一些个人组件下载地址: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。 eclipse
<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>OK,大功告成,文章写得很差,但均是原创,大神勿喷,初学者可参考借鉴。