Android之TrafficStats实现流量实时监测

举报
chenyu 发表于 2021/07/26 23:09:11 2021/07/26
【摘要】 ---恢复内容开始--- TrafficStats类是由Android提供的一个从你的手机开机开始,累计到现在使用的流量总量,或者统计某个或多个进程或应用所使用的流量,当然这个流量包括的Wifi和移动数据网Gprs。这里只针对手机所使用的流量作介绍,至于统计某个进程应用使用的流量,道理都差不多,小伙伴们可以自己查下文档。首先先介绍一下TrafficStats常用的一...





































































































































































































































































































}


1、TrafficStats类的使用

以下结论,是自己真机实测的结果,与自己在网上看到的不同,大家可自测验证。

(1)getMobile...方法,获取Gprs/3G流量

(2)getTotal...方法,获取Gprs/3G+Wifi的流量

以上两类方法统计的都是,从打开网络开始,到关闭网络,这一段时间内使用的流量。例如:10点打开,11点关闭,那么getMobileRxBytes方法,回返的是这段时间内Gprs/3G接受到的字节数。

(3)getUid...方法,获取某个网络UID的流量。这类方法,返回的是,从开机到关机,某个网络UID(我理解就是某个应用,如果不对,请在评论中指正)使用的Gprs/3G+Wifi的流量


2、getUid...方法的使用

以下这段代码是网上找的,出处找不到了,希望原作者不要介意啊


  
  1. List<PackageInfo> packinfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS);
  2. for (PackageInfo info : packinfos) {
  3. String[] premissions = info.requestedPermissions;
  4. if (premissions != null && premissions.length > 0) {
  5. for (String premission : premissions) {
  6. if ("android.permission.INTERNET".equals(premission)) {
  7. // System.out.println(info.packageName+"访问网络");
  8. int uid = info.applicationInfo.uid;
  9. long rx = TrafficStats.getUidRxBytes(uid);
  10. long tx = TrafficStats.getUidTxBytes(uid);
  11. if (rx < 0 || tx < 0) {
  12. System.out.println(info.packageName + "没有产生流量");
  13. } else {
  14. System.out.println(info.packageName + "的流量信息:");
  15. System.out.println("下载的流量" + Formatter.formatFileSize(this, rx));
  16. System.out.println("上传的流量" + Formatter.formatFileSize(this, tx));
  17. }
  18. }
  19. }
  20. System.out.println("---------");
  21. }
  22. }
3、获取流量信息的Service类

(1)因为两个广播都需要动态注册,所以写成了Service

(2)getMobile...和getTotal...方法获取的都是从打开网络开始,到关闭网络,这一段时间内使用的流量。

因此要在网络正在关闭时获取的就是这段时间的流量,WifiManager.WIFI_STATE_DISABLING表示的就是这个状态

(3)Gprs/3G貌似没有类似的状态,可以被监控到,只有,State.CONNECTED和State.DISCONNECTED。但是处于State.DISCONNECTED这个状态时,getMobile...方法获取到的值就都是0了

所有,我不得不在State.CONNECTED这个状态开始时,开启线程用于获取Gprs/3G的流量,直到我获取的到数据为0时,保存上一次的数据。

如果大家有更好的方法,请务必告诉我啊!


  
  1. package forrest.forassist.service;
  2. import android.app.Service;
  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.IntentFilter;
  7. import android.net.ConnectivityManager;
  8. import android.net.NetworkInfo;
  9. import android.net.NetworkInfo.State;
  10. import android.net.TrafficStats;
  11. import android.net.wifi.WifiManager;
  12. import android.os.IBinder;
  13. import android.text.format.Formatter;
  14. import android.util.Log;
  15. import forrest.forassist.db.MySQLiteDatabase;
  16. import forrest.forassist.utils.Util;
  17. public class TrafficService extends Service {
  18. private TrafficReceiver tReceiver;
  19. private WifiManager wifiManager;
  20. private ConnectivityManager cManager;
  21. public IBinder onBind(Intent intent) {
  22. return null;
  23. }
  24. public void onCreate() {
  25. // WifiManager,ConnectivityManager
  26. wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  27. cManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
  28. // 注册TrafficReceiver
  29. tReceiver = new TrafficReceiver();
  30. IntentFilter filter = new IntentFilter();
  31. filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
  32. filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  33. registerReceiver(tReceiver, filter);
  34. super.onCreate();
  35. }
  36. public int onStartCommand(Intent intent, int flags, int startId) {
  37. return super.onStartCommand(intent, flags, startId);
  38. }
  39. private class TrafficReceiver extends BroadcastReceiver {
  40. private String action = "";
  41. private static final String TAG = "TrafficReceiver";
  42. long mobileRx;
  43. long mobileTx;
  44. public void onReceive(Context context, Intent intent) {
  45. action = intent.getAction();
  46. if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
  47. if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLING) {
  48. Log.i(TAG, "WIFI_STATE_DISABLING");
  49. long wifiDown = TrafficStats.getTotalRxBytes() - TrafficStats.getMobileRxBytes();
  50. long wifiUp = TrafficStats.getTotalTxBytes() - TrafficStats.getMobileTxBytes();
  51. MySQLiteDatabase sqLite = new MySQLiteDatabase(context); // 打开数据库
  52. sqLite.insertWifi(Util.todayDate, wifiDown, wifiUp);
  53. sqLite.closeDB();
  54. Log.i(TAG, "wifi下载流量" + Formatter.formatFileSize(context, wifiDown));
  55. Log.i(TAG, "wifi上传流量" + Formatter.formatFileSize(context, wifiUp));
  56. }
  57. } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
  58. Log.i(TAG, "CONNECTIVITY_ACTION");
  59. NetworkInfo networkInfo = cManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  60. State state = networkInfo.getState();
  61. if (state == State.CONNECTED) {
  62. Log.i(TAG, "State.CONNECTED");
  63. // 开始不断获取最近的流量信息,值为0时,跳过
  64. new Thread() {
  65. public void run() {
  66. long mobileRxType = TrafficStats.getMobileRxBytes();
  67. long mobileTxType = TrafficStats.getMobileTxBytes();
  68. if (mobileRxType + mobileTxType != 0) {
  69. try {
  70. mobileRx = mobileRxType;
  71. mobileTx = mobileTxType;
  72. Log.i(TAG, "mobileRx:" + mobileRx);
  73. Log.i(TAG, "mobileTx:" + mobileTx);
  74. Thread.sleep(1000);
  75. run();
  76. } catch (InterruptedException e) {
  77. e.printStackTrace();
  78. }
  79. } else {
  80. // 写入数据库
  81. Log.i(TAG, "写入数据库");
  82. MySQLiteDatabase sqLite = new MySQLiteDatabase(TrafficService.this);
  83. sqLite.insertGprs(Util.todayDate, mobileRx, mobileTx);
  84. sqLite.closeDB();
  85. }
  86. };
  87. }.start();
  88. }
  89. }
  90. }
  91. }
  92. public void onDestroy() {
  93. unregisterReceiver(tReceiver);
  94. super.onDestroy();
  95. }
  96. }






文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/52305065

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。