——去年学了android两个月,今年由于项目再度拾起,过了个年真是基本忘光了,依旧菜鸟一个

——由于项目需要研究了一下流量监控,下面是对于android流量监控的一点心得体会

1. android实现流量监控在2.2版本之前没有专门的类和接口,我网上查看的大家的方法基本上都是读取一个文件/proc/net/dev,这个方法我没有使用,没有进行深入研究。

2. 我是用的是android2.2及之后版本有的流量监控类,TrafficStats,这个类里提供了以下几种方法,

static long getMobileRxBytes()//获取通过Mobile连接收到的字节总数,但不包含WiFi
static long getMobileRxPackets()//获取Mobile连接收到的数据包总数
static long getMobileTxBytes()//Mobile发送的总字节数
static long getMobileTxPackets()//Mobile发送的总数据包数
static long getTotalRxBytes()//获取总的接受字节数,包含Mobile和WiFi等
static long getTotalRxPackets()//总的接受数据包数,包含Mobile和WiFi等
static long getTotalTxBytes()//总的发送字节数,包含Mobile和WiFi等
static long getTotalTxPackets()//发送的总数据包数,包含Mobile和WiFi等
static long getUidRxBytes(int uid)//获取某个网络UID的接受字节数
static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数

由于项目中需要用到监控各个应用的流量,我的思路是,获取手机中所有具有联网权限的应用,并且以列表形式显示出来,然后选择相应的应用,即可对其进行流量监控。

这里用到的便是getUidRxBytes(int uid)和getUidTxBytes(int uid)这两个方法。在我获取手机中所有具有联网权限的应用之前,我是把手机中所有应用的流量使用情况都显示了出来,我发现,连拨号器这种都有流量,最后我得出结论,这两个类方法获取的流量包括本地流量,所以就会出现连没有联网权限的应用都发送和接收字节数这种情况。

下面上一段我用于流量监控的代码。

[java]view plaincopyprint?
  1. publicvoiddingshi(){
  2. mdb.openDB();//打开数据库
  3. runnableapp=newRunnable(){//线程对象
  4. @Override
  5. publicvoidrun(){
  6. while(flag==0){//用于停止线程时的判断
  7. try{
  8. Thread.sleep(1000);//每1000ms进行流量监控
  9. }catch(InterruptedExceptione){
  10. //TODOAuto-generatedcatchblock
  11. e.printStackTrace();
  12. }
  13. inti=0;
  14. Log.v("app","id---->"+Thread.currentThread().getId());
  15. try{
  16. for(i=0;i<listuser.size();i++){//listuser想要监控的应用,只要列表不再重新选择,则获取应用的顺序一定
  17. Log.v("app","开始"+Thread.currentThread().getId());
  18. uid=Integer.parseInt(listuser.get(i));//列表中第i个选择的应用的uid
  19. appinfo=listappinfo.get(i);
  20. Calendarcalendar=Calendar.getInstance();
  21. intmonth=calendar.get(Calendar.MONTH)+1;
  22. intday=calendar.get(Calendar.DAY_OF_MONTH);
  23. inthour=calendar.get(Calendar.HOUR_OF_DAY);
  24. intminute=calendar.get(Calendar.MINUTE);
  25. intsecond=calendar.get(Calendar.SECOND);
  26. floatmill=calendar.get(Calendar.MILLISECOND);
  27. Stringtime=calendar.get(Calendar.YEAR)+"年"
  28. +month+"月"
  29. +day+"日"
  30. +hour+"时"
  31. +minute+"分"
  32. +second+"秒"
  33. +mill+"毫秒";
  34. time02[i]=day*24*60*60+hour*60*60+minute*60+second+mill/1000;//单位是秒新获取的时间,肯定大于前面获取的时间
  35. System.out.println("现在的时间"+i+"--->"+time02[i]);
  36. System.out.println("之前的时间"+i+"--->"+time01[i]);
  37. recv[i]=TrafficStats.getUidRxBytes(uid);
  38. if(recv[i]>0){
  39. recv[i]=recv[i]/(1024*1024);//单位化为MB
  40. }else{
  41. recv[i]=0;
  42. }
  43. tran[i]=TrafficStats.getUidTxBytes(uid);
  44. if(tran[i]>0){
  45. tran[i]=tran[i]/(1024*1024);
  46. }
  47. else{
  48. tran[i]=0;
  49. }
  50. totalapp[i]=recv[i]+tran[i];
  51. recvrate[i]=((recv[i]-recv01[i])*1024*1024)/(time02[i]-time01[i]);//单位为B/s//均为瞬时速率
  52. tranrate[i]=((tran[i]-tran01[i])*1024*1024)/(time02[i]-time01[i]);
  53. totalapprate[i]=((totalapp[i]-totalapp01[i])*1024*1024)/(time02[i]-time01[i]);
  54. System.out.println(appinfo+i+"---->"+"接收速率---->"+recvrate[i]+"发送速率---->"+tranrate[i]+"total速率---->"+totalapprate[i]);
  55. System.out.println("时间间隔"+i+"---->"+(time02[i]-time01[i]));
  56. recv01[i]=recv[i];//给全局变量赋新值
  57. tran01[i]=tran[i];
  58. totalapp01[i]=totalapp[i];
  59. time01[i]=time02[i];
  60. System.out.println("uid="+uid+"---->"+"recv="+recv[i]);
  61. System.out.println("uid="+uid+"---->"+"tran="+tran[i]);
  62. System.out.println("uid="+uid+"---->"+totalapp[i]);
  63. System.out.println("appinfo="+appinfo);
  64. try{
  65. mdb.addTrafficData(time,appinfo,String.valueOf(uid),String.valueOf(tran[i]),String.valueOf(recv[i]),String.valueOf(totalapp[i]),String.valueOf(tranrate[i]),String.valueOf(recvrate[i]),String.valueOf(totalapprate[i]));
  66. }catch(Exceptione){
  67. System.out.println("----->app出现异常");
  68. }
  69. Log.v("app","结束"+Thread.currentThread().getId());
  70. }
  71. }catch(Exceptione){
  72. System.out.println("异常");
  73. }
  74. }
  75. }
  76. };
  77. ThreadAppThread=newThread(runnableapp);
  78. AppThread.start();
  79. }
[java]view plaincopyprint?
[java]view plaincopyprint?
  1. <spanstyle="font-size:18px;">——欢迎大家批评指正,共同探讨</span>

——心静自然凉,心静自然凉。。。

更多相关文章

  1. MAT:如何诊断“字节”的x实例,由“”占用y (z%)字节的“内存问题
  2. 网路搜集:java整型数与网络字节序的 byte[] 数组转换关系
  3. java-IO流3(缓冲输入字节流)
  4. Java中字符流和字节流到底有什么区别!!!
  5. Java IO流系列(四)—— 从字节流及其缓冲区到转换流
  6. Java——IO类,字节流读数据
  7. Java 字节流与字符流的总结和理解

随机推荐

  1. 搞懂Netty(1)一个基本入门案例(使用Springbo
  2. 关于华三无线控制器许可申请及扩容的补充
  3. 搞懂Netty(2)拆包和粘包问题的解决
  4. spring jdbctemplate 和mybatis的比较
  5. 运行时依赖收集机制
  6. IT人为什么难以拿到高薪?
  7. Vuex
  8. mysql从入门到优化(2)数据的增删改查操作总
  9. GraphQL
  10. 我司服务器上几个常用的监控工具,俺全瞟来