---恢復內容開始---
TrafficStats類是由Android提供的一個從你的手機開機開始,累計到現在使用的流量總量,或者統計某個或多個進程或應用所使用的流量,當然這個流量包括的Wifi和移動數據網Gprs。這里只針對手機所使用的流量作介紹,至於統計某個進程應用使用的流量,道理都差不多,小伙伴們可以自己查下文檔。首先先介紹一下TrafficStats常用的一些方法:
TrafficStats.getTotalRxBytes() ——獲取從此次開機起總接受流量(流量是分為上傳與下載兩類的,當然其實這里還有本地文件之間數據交換的流量,這個暫且不說,等下說明一下我遇到的問題);
TrafficStats.getTotalTxBytes()——獲取從此次開機起總發送流量;
TrafficStats.getMobileRxBytes()——獲取從此次開機起不包括Wifi的接受流量,即只統計數據網Gprs接受的流量;
TrafficStats.getMobileTxBytes()——獲取從此次開機起不包括Wifi的發送流量,即只統計數據網Gprs發送的流量;
於是,小伙伴們可以用getTotalRxBytes() - getMobileRxBytes()獲取手機Wifi的接受流量,同理獲得Wifi的發送流量。
那么,現在問題來了(不說挖掘機,畢竟藍翔強):我上面所說的幾個方法都是統計從手機開機到現在所使用的總流量,而我需要實現的是檢測手機的實時流量使用,或者說我還要算出此刻的網速。那該咋辦呢?
這當然也難不了小伙伴們的,我是這樣實現的:先獲取此刻的總流量,譬如說00:00:00時刻的總使用流量,然后再統計00:00:01時刻的總使用流量,那么兩者相減便是這1秒鍾所使用的流量,當然你也可以設定為零點幾秒。我這里是用線程來實現的,當然你們也可以用Timer,定時器之類的途徑實現。
1.先寫一個方法,用於統計Wifi下使用的流量:
public double getWifiTraffic(double time){
double rtotalGprs = TrafficStats.getTotalRxBytes();
double ttotalGprs = TrafficStats.getTotalTxBytes();
double rgprs = TrafficStats.getMobileRxBytes();
double tgprs = TrafficStats.getMobileTxBytes();
double rwifi = rtotalGprs - rgprs;
double twifi = ttotalGprs - tgprs;
totalWifi = rwifi + twifi;
return totalWifi;
}
2.用一個TextView來顯示一下我們統計的流量數據:
3.然后我們新建一個線程用handler更新UI:
new Thread(new Runnable() {
@Override
public void run() {
while(true){
//獲取當前時刻
double currentTime = System.currentTimeMillis();
// getWifiTraffic(currentTime);
獲取當前時刻的Wifi流量
double totalWifi01 = getWifiTraffic(currentTime);
//讓線程休眠1秒鍾
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//獲取1秒鍾之后的時刻
double frontTime = System.currentTimeMillis();
// 獲取一秒鍾之后時刻所對應的Wifi使用流量
double totalWifi02 = getWifiTraffic(frontTime);
//兩者相減得到這1秒鍾所產生的Wifi流量
double errorTraffic = totalWifi02 - totalWifi01;
//這里之所以有一個流量<512b,不將其計入流量統計的原因就是由於我前面提及的本地進程產生的本地流量,如果不減的話,你會發現Android會把不聯網狀態下
//本地進程之間交互的本地流量也計算進去,我測試了一下大概在每秒鍾200b左右
if(errorTraffic < 512){
errorTraffic = 1;
}
//將byte轉化為為Mb,1048576=1024*1024,只不過在實際統計中計算會有少許偏差,小伙伴們可根據實際情況微調
wf += errorTraffic/1048576;
wifiTraffic = df.format(wf);
// Log.i("使用的流量", wifiTraffic + "");
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}
}).start();
final Handler handler = new Handler{
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
//當流量小於1時,由於0.5這樣的數我們會看到手機上會顯示為.5,因此在前面加一個0以顯示完整
if(Double.parseDouble(wifiTraffic) < 1){
tv.setText("0" + wifiTraffic + "MB");
}
else{
tv.setText(wifiTraffic + "MB");
}
}
}
};
下面貼一下整段代碼:
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.TrafficStats;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
double totalWifi;
public static String wifiTraffic ;
public static double wf =0;
private TextView textView;
private WifiManager wifiManager;
public static int wifiStr;
DecimalFormat df = new DecimalFormat(".##");
private TextView tv;
private Handler handler1= null;
int hours = 0,minutes = 0,seconds = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.textView);
wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
wifiStr = wifiManager.getWifiState();
if(wifiStr != 3){
Toast.makeText(this, "Wifi未連接", 1000).show();
}
if(wifiStr == 3){
final Handler handler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
if(Double.parseDouble(wifiTraffic) < 1){
Log.i("wifiTraffic", wifiTraffic);
textView.setText("0" + wifiTraffic + "MB");
}
else{
textView.setText(wifiTraffic + "MB");
}
}
}
};
tv = (TextView)findViewById(R.id.tv3);
if(wifiStr == 3){
handler1 = new Handler(){
public void handleMessage(Message msg1){
super.handleMessage(msg1);
if(msg1.what == 1){
tv.setText(new DecimalFormat("00").format(hours) + ":" +
new DecimalFormat("00").format(minutes) + ":" + new DecimalFormat("00").format(seconds));
}
}
};
}
new Thread(new Runnable() {
public void run(){
for(int i = 0;;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
seconds++;
Message msg1 = new Message();
msg1.what = 1;
handler1.sendMessage(msg1);
if(seconds == 60){
seconds = 0;
minutes++;
if(minutes == 60){
minutes = 0;
hours++;
}
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
double currentTime = System.currentTimeMillis();
// getWifiTraffic(currentTime);
double totalWifi01 = getWifiTraffic(currentTime);;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
double frontTime = System.currentTimeMillis();
// getWifiTraffic(frontTime);
double totalWifi02 = getWifiTraffic(frontTime);
double errorTraffic = totalWifi02 - totalWifi01;
if(errorTraffic < 512){
errorTraffic = 1;
}
wf += errorTraffic/1111500;
wifiTraffic = df.format(wf);
// Log.i("使用的流量", wifiTraffic + "");
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}
}).start();
}
}
public double getWifiTraffic(double time){
double rtotalGprs = TrafficStats.getTotalRxBytes();
double ttotalGprs = TrafficStats.getTotalTxBytes();
double rgprs = TrafficStats.getMobileRxBytes();
double tgprs = TrafficStats.getMobileTxBytes();
double rwifi = rtotalGprs - rgprs;
double twifi = ttotalGprs - tgprs;
totalWifi = rwifi + twifi;
return totalWifi;
//totalWifi = rtotalGprs + ttotalGprs;
}
}
個人拙見,希望對大家有點幫助^_^
---恢復內容結束---