android流量簡介
- 流量統計文件:路徑
/proc/net/dev
如上圖: lo 爲本地流量, rmnet0 爲3g/2g流量, wlan0 爲無線流量.android
-
在
/sys/class/net/
下 能夠找到相關類別(如rmnet0)的目錄.在其子目錄statistics下游rxbytes和txbytes記錄收發流量.git -
在
/proc/uid_stat/{uid}/tcp_rcv
記錄該uid應用下載流量字節,/proc/uid_stat/{uid}/tcp_snd
有該uid應用上傳流量字節github
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的發送字節數
備註:TrafficStats類在Android 2.2 API Level(8)以後出現。網絡
設計一個合理的APP流量統計
- 記錄某App開關機流量使用
由於getUidRxBytes(int uid)
和 getUidTxbytes(int uid)
記錄的是 該uid應用 在手機啓動到你使用這個方法時的流量統計.故須要在手機關機時記錄你這個程序在此次開關機過程當中的使用流量記錄.tcp
public class ShutDownReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //在關機時 記錄uid應用 本次流量結餘 } }
- 記錄Wifi中的流量使用
由於getUidRxBytes(int uid)
和 getUidTxbytes(int uid)
包括了全部網絡形式的流量,即包括WIFI和3g/2g.故須要監聽WIFI變化,並記錄WIFI過程當中該uid應用使用的流量記錄.ide
public class WifiStateReceiver extends BroadcastReceiver implements ISusoConstants { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); if (wifistate == WifiManager.WIFI_STATE_DISABLED) {//若是關閉 //結餘本次wifi過程當中 uid應用的 流量 } else if (wifistate == WifiManager.WIFI_STATE_ENABLED) { //記錄當前uid應用的流量. } } } }
- 使用每日鬧鈴統計/開機時判斷昨日統計是否完成.
經過每日結餘計算,得出該日APP的總流量以及WIFI流量佔用和2g/3g的流量佔用.學習
- 獲取流量代碼
PackageManager pm = context.getPackageManager(); ApplicationInfo ai = pm.getApplicationInfo("com.51zaozao.traffic", PackageManager.GET_ACTIVITIES); long inTraffic = TrafficStats.getUidRxBytes(ai.uid); long outTraffic = TrafficStats.getUidTxBytes(ai.uid);