测试应用流量的时候,需要区分前台和后台试用的流量,但是目前一些Android 手机自带的流量监控已经没有那么细的一个区分,通常只有一个百分数。由于测试需要我自己写了一个APP 来测试
原理很简单,其实就是 使用 TrafficStats 来获取流量,其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的发送字节数
效果图:
代码:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.maple.trafficmonitoring.MainActivity">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_above="@+id/btnStart" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="流量监控"
android:id="@+id/btnStart"
android:background="@drawable/test_button"
android:textSize="@dimen/text_size_test"
android:textColor="@color/white"
android:layout_above="@+id/btnStart1"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
MainActivity
package com.maple.trafficmonitoring;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.TrafficStats;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import java.math.BigDecimal;
import java.util.List;
public class MainActivity extends Activity {
private Button btnStart,btnStart1;
private ListView lstViProgramme; ;
private ProcessInfo processInfo;
private int pid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStart = (Button) findViewById(R.id.btnStart);
lstViProgramme = (ListView) findViewById(R.id.listView);
btnStart1 = (Button) findViewById(R.id.btnStart1);
processInfo = new ProcessInfo();
lstViProgramme.setAdapter(new ListAdapter());
lstViProgramme.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
RadioButton rdBtn = (RadioButton) ((LinearLayout) view).getChildAt(0);
rdBtn.setChecked(true);
}
});
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListAdapter adapter = (ListAdapter) lstViProgramme.getAdapter();
if (adapter.checkedProg != null){
String packageName = adapter.checkedProg.getPackageName();
String APPName = adapter.checkedProg.getProcessName();
Intent intent = new Intent(MainActivity.this,StartMonitor.class);
intent.putExtra("packageName",packageName);
intent.putExtra("APPName",APPName);
startActivity(intent);
}else {
Toast.makeText(MainActivity.this, "请选择需要测试的应用程序", Toast.LENGTH_SHORT).show();
}
}
});
private class ListAdapter extends BaseAdapter {
List<Programe> programes;
Programe checkedProg;
int lastCheckedPosition = -1;
public ListAdapter() {
programes = processInfo.getAllPackages(getBaseContext());
}
@Override
public int getCount() {
return programes.size();
}
@Override
public Object getItem(int position) {
return programes.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Programe pr = (Programe) programes.get(position);
if (convertView == null)
convertView = getLayoutInflater().inflate(R.layout.list_item, parent, false);
Viewholder holder = (Viewholder) convertView.getTag();
if (holder == null) {
holder = new Viewholder();
convertView.setTag(holder);
holder.imgViAppIcon = (ImageView) convertView.findViewById(R.id.image);
holder.txtAppName = (TextView) convertView.findViewById(R.id.text);
holder.rdoBtnApp = (RadioButton) convertView.findViewById(R.id.rb);
holder.rdoBtnApp.setFocusable(false);
holder.rdoBtnApp.setOnCheckedChangeListener(checkedChangeListener);
}
holder.imgViAppIcon.setImageDrawable(pr.getIcon());
holder.txtAppName.setText(pr.getProcessName());
holder.rdoBtnApp.setId(position);
holder.rdoBtnApp.setChecked(checkedProg != null && getItem(position) == checkedProg);
return convertView;
}
CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {