2.3開始android就提供來這個類的API,這樣我們就可以方便的用他來實現統計手機流量來。這個類其實也很簡單,我貼上他的幾個方法,大家一看就知道怎么用了。
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的發送字節數,某一個進程的總發送量
下面說我做實時網速的思路:
1.獲得當前的總接受數據,getTotalRxPackets()
2.每隔幾秒再獲取一次總接收的數據
3.講最新獲取的數據減去之前獲取的數據並且除以間隔的秒數,就得到了每秒平均的網速b/s,最后進行單位轉換為kb、Mb等等
實現:
1.得到當前網速的方法
初始時給total_data一個值:
private long total_data = TrafficStats.getTotalRxBytes();
之后每次獲取的數值要減去total_data再除以間隔秒數,並且將total重新賦值為最新的。
/** * 核心方法,得到當前網速 * @return */ private int getNetSpeed() { long traffic_data = TrafficStats.getTotalRxBytes() - total_data; total_data = TrafficStats.getTotalRxBytes(); return (int)traffic_data /count ; }
2.周期性的獲取網速
/** * 定義線程周期性地獲取網速 */ private Runnable mRunnable = new Runnable() { @Override public void run() { //定時器 mHandler.postDelayed(mRunnable, count * 1000); Message msg = mHandler.obtainMessage(); msg.what = 1; msg.arg1 = getNetSpeed(); mHandler.sendMessage(msg); } };
3.單位轉換
@Override public void onCreate() { super.onCreate(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { //float real_data = (float)msg.arg1; if(msg.arg1 > 1024 ){ System.out.println(msg.arg1 / 1024 + "kb/s"); } else{ System.out.println(msg.arg1 + "b/s"); } } } }; }
4.啟動handler和停止handler
PS:服務開始就執行runnable中的方法,並且runnable中設置handler循環執行。執行runnable中run()方法時,將網速包裝到message中,交給handler進行單位轉換並顯示(這里在handler中進行單位轉換是為了方便顯示到ui中)
/** * 啟動服務時就開始啟動線程獲取網速 */ @Override public void onStart(Intent intent, int startId) { mHandler.postDelayed(mRunnable, 0); }; /** * 在服務結束時刪除消息隊列 */ @Override public void onDestroy() { mHandler.removeCallbacks(mRunnable); super.onDestroy(); };
@Override public void onCreate() { super.onCreate(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { //float real_data = (float)msg.arg1; if(msg.arg1 > 1024 ){ System.out.println(msg.arg1 / 1024 + "kb/s"); } else{ System.out.println(msg.arg1 + "b/s"); } } } };
最后,全部代碼
Service:
package com.kale.netspeed; import android.app.Service; import android.content.Intent; import android.net.TrafficStats; import android.os.Handler; import android.os.IBinder; import android.os.Message; /** * @author:Jack Tony * @tips :實時獲取當前網速的service * @date :2014-9-24 */ public class Net_Service extends Service { private long total_data = TrafficStats.getTotalRxBytes(); private Handler mHandler; //幾秒刷新一次 private final int count = 5; /** * 定義線程周期性地獲取網速 */ private Runnable mRunnable = new Runnable() { @Override public void run() { //定時器 mHandler.postDelayed(mRunnable, count * 1000); Message msg = mHandler.obtainMessage(); msg.what = 1; msg.arg1 = getNetSpeed(); mHandler.sendMessage(msg); } }; @Override public void onCreate() { super.onCreate(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { //float real_data = (float)msg.arg1; if(msg.arg1 > 1024 ){ System.out.println(msg.arg1 / 1024 + "kb/s"); } else{ System.out.println(msg.arg1 + "b/s"); } } } }; } /** * 核心方法,得到當前網速 * @return */ private int getNetSpeed() { long traffic_data = TrafficStats.getTotalRxBytes() - total_data; total_data = TrafficStats.getTotalRxBytes(); return (int)traffic_data /count ; } /** * 啟動服務時就開始啟動線程獲取網速 */ @Override public void onStart(Intent intent, int startId) { mHandler.postDelayed(mRunnable, 0); }; /** * 在服務結束時刪除消息隊列 */ @Override public void onDestroy() { mHandler.removeCallbacks(mRunnable); super.onDestroy(); }; @Override public IBinder onBind(Intent intent) { return null; } }
<service android:name="com.kale.netspeed.Net_Service"/>
Activity:
package com.kale.netspeed; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService(new Intent(MainActivity.this,Net_Service.class)); } }
參考自:http://gundumw100.iteye.com/blog/1294167