1. 程式人生 > >android流量監控類TrafficStats講解

android流量監控類TrafficStats講解

最近無聊看了關於android流量監控方面的知識,發覺android在這方面做得很是全面,google已經將對於流量監控類TrafficStats都封裝好了,非常容易上手,對於學習android開發的人來說,無疑是極大的利器。

先此宣告:以下的例子大部分來自於網路(就是我學流量監控的時候,在網上找的例子),但個人覺得,例子本身寫得非常棒,所以自己稍作修改拿來擺上架~~~呵呵呵呵呵。

好了,廢話不多說,轉入正題。

在看程式碼前,先說明一下android怎樣統計手機內的流量的使用情況的呢?其實,

Android是基於linux的一個作業系統。

在Android中,你用Root Explorer去檢視系統檔案的話,與流量監控相關的會有這麼幾個檔案

/proc/net/dev這個檔案中具體記錄的暫時不是非常清楚,可能是整個系統的一個流量情況。

/proc/uid_stat/%d" 和"/proc/uid_stat/%d" %d為程序的UID。這個檔案裡只有兩項資料tcp_rcv和tcp_snd。

看命名大家應該就能看出代表什麼,一個代表總的接受位元組數,一個代表總的傳送位元組數。

這兩個檔案為非標準linux核心檔案,由android核心層/kernel/net/Socket.c 的__sock_sendmsg函式負責寫入, 使用者層套接字通訊在核心層最終會呼叫此函式 (包括本地套接字和網路套接字)。

而Android在2.3之前是沒有封裝響應的流量監控API的。在2.3之後呢,把資料流量監控封裝到了Android.net.TrafficStats類中。其原理就是讀取上文提到的那幾處檔案。其中有的方法也是讀取的別的檔案。

先讓我們來看一下配置檔案,main.xml [java] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >  
  6.     <Button   
  7.         android:id="@+id/showList"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="wrap_content"
  10.         android:text="顯示當前程式流量"/>  
  11. </LinearLayout>  
配置檔案非常的簡單,只是定義了一個Button元件,其id為showList

好了,再來看一下activity內的程式碼

[java] view plaincopyprint?
  1. publicclass TrafficStatsActivity extends Activity {  
  2.     /** Called when the activity is first created. */
  3.     private Button showBtn=null;  
  4.     @Override
  5.     publicvoid onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.         showBtn=(Button) findViewById(R.id.showList);  
  9.         showBtn.setOnClickListener(new ButtonListener());  
  10.     }  
  11.     publicvoid getAppTrafficList(){  
  12.         //獲取所有的安裝在手機上的應用軟體的資訊,並且獲取這些軟體裡面的許可權資訊
  13.         PackageManager pm=getPackageManager();//獲取系統應用包管理
  14.         //獲取每個包內的androidmanifest.xml資訊,它的許可權等等
  15.         List<PackageInfo> pinfos=pm.getInstalledPackages  
  16.                 (PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS);  
  17.         //遍歷每個應用包資訊
  18.         for(PackageInfo info:pinfos){  
  19.             //請求每個程式包對應的androidManifest.xml裡面的許可權
  20.             String[] premissions=info.requestedPermissions;  
  21.             if(premissions!=null && premissions.length>0){  
  22.                 //找出需要網路服務的應用程式
  23.                 for(String premission : premissions){  
  24.                     if("android.permission.INTERNET".equals(premission)){  
  25.                         //獲取每個應用程式在作業系統內的程序id
  26.                         int uId=info.applicationInfo.uid;  
  27.                         //如果返回-1,代表不支援使用該方法,注意必須是2.2以上的
  28.                         long rx=TrafficStats.getUidRxBytes(uId);  
  29.                         //如果返回-1,代表不支援使用該方法,注意必須是2.2以上的
  30.                         long tx=TrafficStats.getUidTxBytes(uId);  
  31.                         if(rx<0 || tx<0){  
  32.                             continue;  
  33.                         }else{  
  34.                             Toast.makeText(this, info.applicationInfo.loadLabel(pm)+"消耗的流量--"+  
  35.                         Formatter.formatFileSize(this, rx+tx), Toast.LENGTH_SHORT);  
  36.                         }  
  37.                     }  
  38.                 }  
  39.             }  
  40.         }  
  41.     }  
  42.     privateclass ButtonListener implements OnClickListener{  
  43.         @Override
  44.         publicvoid onClick(View v) {  
  45.             // TODO Auto-generated method stub
  46.             getAppTrafficList();  
  47.         }  
  48.     }  
  49. }  

這裡要注意的是這三句程式碼: [java] view plaincopyprint?
  1. //獲取每個應用程式在作業系統內的程序id
  2. int uId=info.applicationInfo.uid;  
  3. //如果返回-1,代表不支援使用該方法,注意必須是2.2以上的
  4. long rx=TrafficStats.getUidRxBytes(uId);  
  5. //如果返回-1,代表不支援使用該方法,注意必須是2.2以上的
  6. long tx=TrafficStats.getUidTxBytes(uId);  

頭一句程式碼主要的作用是獲取宣告到的網路許可權的application的程序系統id,就類似與我們window下的程序PID。
而第二句的作用毫無疑問的就是根據該程序的id獲取到改應用程式開機到現在從網路上接收到的位元組(以KB為單位),最後一句則是根據該程序的id獲取到改應用程式開機到現在向網路上傳送的位元組(以KB為單位)。好了其他的也就沒什麼了。一些程式碼我也子啊程式內注有註釋了。最後說一句,TrafficStats這個類只能在android2.2以上的版本才能夠使用,還有,測試的時候最好用真機來測試。因為模擬器的話,可能會造成rx和tx這兩個引數總為-1.
^ _^

相關推薦

android流量監控TrafficStats講解

最近無聊看了關於android流量監控方面的知識,發覺android在這方面做得很是全面,google已經將對於流量監控類TrafficStats都封裝好了,非常容易上手,對於學習android開發的人來說,無疑是極大的利器。 先此宣告:以下的例子大部分來自於網路(就是

(整理篇二)Android流量監控

一 Android與流量相關的檔案: /proc/net/dev,記錄各個網路介面(wlan, ccmni1,lo,ifb,tunl,sit,ip6tnl,p2p)傳送、接收流量的值。 /proc/uid_stat/app_uid,該路徑下有兩個檔案:tcp

android 流量監控實現想法

 經過2,3周的時間研究流量的監控,什麼TrafficStats提供的方法,做的時候蛋疼的要屎,2G/3G的流量獲取根本就不準確,至於什麼原因網路上面也有說,就不講了。經過研究,通過讀取/proc/uid_stat/專案uid/下面的兩個檔案,獲取流量資訊。再通過自己的

Android流量統計TrafficStats的使用-2

寫不下了;上面是轉別人的; 本人習慣用C++格式;java同學對付看了,另外在TrafficStats類中還提供很多其他不同的get方法,能夠滿足各種需求。比如只要wifi情況下的,比如只要3G情況下的等等。   

手機Android音視訊採集與直播推送,實現單兵、移動監控應用

      最新手機採集推送直播監控以及EasyDarwin開源流媒體平臺的版本及程式碼:恰逢2014 Google I/O大會,不難看出安卓在Google的推進以及本身的開放性作用下,已經快延生到生活

Android 流量統計TrafficStats總結

流量統計TrafficStats總結         近日,入職了新公司,然後被要求做一個類似於流量監控的應用軟體,之後我在網上查詢了一下有關於網路流量監控的相關的程式碼,找到了實現網路流量的類TrafficStats類,接下來我就我這幾天用到的有關於這個類的的方法做一個總

android例項之——流量監控懸浮窗(實時網速的獲取)

前幾天想做一個類似於360流量監控懸浮窗的效果,可以實時顯示網速。 重要的讀取系統的流量檔案,檔案路徑/proc/self/net/dev 下面是複製下來的dev檔案 Inter-|   Receive                      

android中Log的封裝

col mark pre class 打印日誌 static sta 日誌 blog 1.為了方便的使用Log打印日誌,以及後續方便撤銷日誌打印,所以對Log類進行封裝是一件好事。 1 package market.phone; 2 3 import androi

Android常用工具

cti def air exp -a src 重復元素 nec empty 主要介紹總結的Android開發中常用的工具類,大部分同樣適用於Java。目前包括HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、Prefe

Android ListView多布局講解

androidListview優化是一個老生常談的事情了,其優化的方面也有很多種,例如,布局重用、在getView()中減少邏輯計算、減少在頁面滑動的時候加在圖片,而是在頁面停止滾動的時候再加在圖片。而今天要介紹的是另一種方式,那就是多布局。一般使用的場景有一下兩種情況:① 當一個item有多重布局的情況下,

linux流量監控iftop命令安裝詳解

libpcap 安裝 流量 指定 evel .tar.gz 之前 完成 configure iftop跟nload差不多,也是捕獲網卡流量的命令,nload的安裝見之前發布的教程:http://www.cnblogs.com/catlee/p/5703541.html 開

網絡流量監控工具與分析Ntop和Ntopng

ntop ntopng Ntop工具Ntop Ntop是一種監控網絡流量工具,用ntop顯示網絡的使用情況比其他一些網絡管理軟件更加直觀、詳細。Ntop甚至可以列出每個節點計算機的網絡帶寬利用率。Ntop工作方式 1. 命令行界面 2. web界面Ntop的

Android中Calendar的用法總結

jsb ews 寫法 需要 key data- minute bar 來講 Calendar是Android開發中需要獲取時間時必不可少的一個工具類,通過這個類可以獲得的時間信息還是很豐富的,下面做一個總結,以後使用的時候就不用總是去翻書或者查資料了。 在獲取時間之前要先獲

Android監控home鍵

get 開發 close watcher android inter filter 需要 gist 一、需求 在應用開發過程中,啟動服務開啟線程鎖等待服務返回解鎖,為了避免點擊home鍵使線程鎖卡死的bug,需要監控home鍵,解鎖線程。 二、實現 在應用時,需要regis

Linux流量監控工具(iftop)

連接 常用 sage 表示 www. pan 字符 右箭頭 clas 在類Unix系統中可以使用top查看系統資源、進程、內存占用等信息。查看網絡狀態可以使用netstat、nmap等工具。若要查看實時的網絡流量,監控TCP/IP連接等,則可以使用iftop。 一、ifto

Mac 10.12安裝流量監控軟件Magican

can ref 下載 應用 crack http 流量 app 安裝 說明:Magican這家公司已經不維護了,但是軟件是單機版的,可以正常使用,但是有些10.12的機器應該是無法看到每個進程的明細,總速度可以正常顯示。 下載: (鏈接: https://pan.bai

道路交通實時流量監控預測系統

中小型 組合 實時分析 xadmin spark2 初中 elf ejs 高可用架構 詳情請交流 QQ 709639943 00、道路交通實時流量監控預測系統 00、基於Spark2.x新聞網大數據實時分析可視化系統 00、小碼哥Java大神班五期 任小龍SSM

對網卡流量監控的一些想法

網卡流量監控 sar監控 zabbix監控網卡流量 對網卡流量監控的一些想法今天來給大家講講一些對於網卡流量的想法,網卡流量代表著客戶的訪問你服務的數據量,但是這裏量是有閾值的,如果你的網卡的流量居高不下,那就有可能你的服務器被攻擊了,所以,監控網卡的流量是事關重要的事情,說到監控,我們便可以想

流量監控腳本

sort 流量監控 printf blog 獲取 %d IT else 但是 公司有臺服務器每天晚上流量很高,但是不知道確定是到哪個IP的流量 把改腳本定時到晚上執行 1 #!/bin/sh 2 nic=‘em1‘ 3 myFile=$nic‘monitor‘

設計模式入門前提之UML講解

Java 設計模式 一什麽是uml: UML(unified model language)統一建模語言。是一種標準的圖形化建模語言。主要用於軟件的分析和設計,用定義完善的符號來圖形化展示軟件系統。UML不涉及編程問題,即與語言平臺無關,就使得開發人員可以專註於建立軟件系統的模型和結構。結構圖中比較常