简单的测试安卓网速
2018-03-27 19:50
197 查看
简单的测试安卓网速
package com.qzx.testnetspeed; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.TrafficStats; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.Point; import android.telephony.TelephonyManager; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private TextView tv_upload=null; private TextView tv_download=null; private TextView tv_allInfo=null; private TextView tv_netConnect=null; private EditText et_uid=null; private TextView tv_uid=null; private TextView tv_packageName=null; //反馈类型 private static final int NETWORK_INVALID=0; private static final int NETWORK_WIFI=1; private static final int NETWORK_2G=2; private static final int NETWORK_3G=3; private static final int NETWORK_4G=4; //移动数据网络信息 public static final int NETWORK_TYPE_1xRTT = 7; public static final int NETWORK_TYPE_CDMA = 4; public static final int NETWORK_TYPE_EDGE = 2; public static final int NETWORK_TYPE_EHRPD = 14; public static final int NETWORK_TYPE_EVDO_0 = 5; public static final int NETWORK_TYPE_EVDO_A = 6; public static final int NETWORK_TYPE_EVDO_B = 12; public static final int NETWORK_TYPE_GPRS = 1; public static final int NETWORK_TYPE_HSDPA = 8; public static final int NETWORK_TYPE_HSPA = 10; public static final int NETWORK_TYPE_HSPAP = 15; public static final int NETWORK_TYPE_HSUPA = 9; public static final int NETWORK_TYPE_IDEN = 11; public static final int NETWORK_TYPE_LTE = 13; public static final int NETWORK_TYPE_UMTS = 3; public static final int NETWORK_TYPE_UNKNOWN = 0; private String netType; private long total_preRx; private long total_nowRx; private long total_resultRx; private long total_preTx; private long total_nowTx; private long total_resultTx; private static final int UPDATE_MSG=0; final Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case UPDATE_MSG: total_nowRx=TrafficStats.getTotalRxBytes(); total_resultRx=total_nowRx-total_preRx; Log.d("zbv", "total_resultRx="+total_resultRx); tv_download.setText(handleUnit(total_resultRx)); //修改前后数据接收流量信息 total_preRx=total_nowRx; total_nowTx=TrafficStats.getTotalTxBytes(); total_resultTx=total_nowTx-total_preTx; Log.d("zbv", "total_resultTx="+total_resultTx); tv_upload.setText(handleUnit(total_resultTx)); //修改前后数据传送流量信息 total_preTx=total_nowTx; break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取当前手机的屏幕大小单位是像素 WindowManager wm=(WindowManager) this.getSystemService(Context.WINDOW_SERVICE); Point point=new Point(); wm.getDefaultDisplay().getSize(point); Toast.makeText(this, "width="+point.x+"px;height="+point.y+"px", 0).show(); //监听网络状态改变 IntentFilter filter=new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); this.registerReceiver(netChangeReceiver, filter); tv_upload=(TextView) findViewById(R.id.tv_upload); tv_download=(TextView) findViewById(R.id.tv_download); tv_allInfo=(TextView) findViewById(R.id.tv_allInfo); tv_netConnect=(TextView) findViewById(R.id.tv_netConnect); et_uid=(EditText) findViewById(R.id.et_uid); tv_uid=(TextView) findViewById(R.id.tv_uid); tv_packageName=(TextView) findViewById(R.id.tv_packageName); switch (checkNetworkConnected()) { case 0: netType="无法连接上任何网络"; break; case 1: netType="连接上wifi"; break; case 2: netType="连接上2G"; break; case 3: netType="连接上3G"; break; case 4: netType = "连接上4G"; break; } tv_netConnect.setText(netType); getTraffics(); fetchTotalTraffic(); // getAllApplication(); } private BroadcastReceiver netChangeReceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)){ Log.d("zbv", "网络状态改变了"); } } }; /** * 检测网络连接并且检测连接成功的简单粗分类型 * */ private int checkNetworkConnected(){ ConnectivityManager cManager=(ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo=cManager.getActiveNetworkInfo(); if(networkInfo!=null&&networkInfo.isConnected()){ String typeNet=networkInfo.getTypeName(); if(typeNet.equals("WIFI")){ return NETWORK_WIFI; }else if(typeNet.equals("MOBILE")){ switch (networkInfo.getSubtype()) { case TelephonyManager.NETWORK_TYPE_CDMA: // telcom case TelephonyManager.NETWORK_TYPE_1xRTT: // telecom case TelephonyManager.NETWORK_TYPE_GPRS: // unicom case TelephonyManager.NETWORK_TYPE_EDGE: // cmcc return NETWORK_2G; case TelephonyManager.NETWORK_TYPE_EHRPD: // telecom case TelephonyManager.NETWORK_TYPE_EVDO_0: // telecom case TelephonyManager.NETWORK_TYPE_EVDO_A: // telecom 3.5G case TelephonyManager.NETWORK_TYPE_EVDO_B: // telecom 3.5G case TelephonyManager.NETWORK_TYPE_HSPA: // unicom case TelephonyManager.NETWORK_TYPE_HSPAP: // unicom case TelephonyManager.NETWORK_TYPE_HSDPA: // unicom 3.5G case TelephonyManager.NETWORK_TYPE_HSUPA: // unicom 3.5G case TelephonyManager.NETWORK_TYPE_UMTS: // unicom return NETWORK_3G; case TelephonyManager.NETWORK_TYPE_LTE: return NETWORK_4G; } } } return NETWORK_INVALID; } /** * 总的流量: * 上传和下载 * * wifi流量 * * 移动网络流量 * * 可能包含本地数据传输的流量 * */ private void getTraffics(){ long rx_total=TrafficStats.getTotalRxBytes(); long tx_total=TrafficStats.getTotalTxBytes(); if(tx_total==TrafficStats.UNSUPPORTED&&rx_total==TrafficStats.UNSUPPORTED){ Toast.makeText(this, "当前设备不支持总流量查询", Toast.LENGTH_LONG).show(); } long rx_mobile=TrafficStats.getMobileRxBytes(); long tx_mobile=TrafficStats.getTotalTxBytes(); if(rx_mobile==TrafficStats.UNSUPPORTED&&tx_mobile==TrafficStats.UNSUPPORTED){ Toast.makeText(this, "当前设备不支持移动网络流量查询", Toast.LENGTH_LONG).show(); } long rx_wifi=rx_total-rx_mobile; long tx_wifi=tx_total-tx_mobile; tv_allInfo.setText("总接收流量="+rx_total+"b/s;wifi的接收流量="+rx_wifi+"b/s;移动网络的接收流量="+rx_mobile+"b/s;"+ "总传送流量="+tx_total+"b/s;wifi的传送流量="+tx_wifi+"b/s;移动网络的传送流量="+tx_mobile+"b/s;"); } /** * 使用uid获取指定包名的应用的流量情况 * 某个应用的网络流量数据保存在系统的 * /proc/uid_stat/$UID/tcp_rcv | tcp_snd文件中 * */ private void getTrafficsThroughUID(int uid){ String rx_name="/proc/uid_stat/"+uid+"/tcp_rcv"; String tx_name="/proc/uid_stat/"+uid+"/tcp_snd"; long uid_rx=TrafficStats.getUidRxBytes(uid); long uid_tx=TrafficStats.getUidTxBytes(uid); if(uid_rx==TrafficStats.UNSUPPORTED&&uid_tx==TrafficStats.UNSUPPORTED){ Toast.makeText(this, "当前设备不支持总流量查询", Toast.LENGTH_LONG).show(); } RandomAccessFile raFile_rx=null; RandomAccessFile raFile_tx=null; try { raFile_rx=new RandomAccessFile(rx_name,"r"); raFile_tx=new RandomAccessFile(tx_name,"r"); uid_rx=Long.parseLong(raFile_rx.readLine()); uid_tx=Long.parseLong(raFile_tx.readLine()); tv_uid.setText("uid_rx="+handleUnit(uid_rx)+";uid_tx="+handleUnit(uid_tx)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(raFile_rx!=null||raFile_tx!=null){ try { raFile_rx.close(); raFile_tx.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 隔1s更新一次总的数据流量 * */ private void fetchTotalTraffic(){ new Timer().schedule(new TimerTask() { @Override public void run() { mHandler.sendEmptyMessage(UPDATE_MSG); } }, 1000,1000); } /** * 处理字节的单位转换 * */ private String handleUnit(long result) { String txt = ""; double loadSpeed; if (result < 1024) { loadSpeed = result; txt = String.format("%1$.2fb/s", loadSpeed); } else if (result >= 1024 && result < (1024 * 1024)) { loadSpeed = Math.round(result / 1024); txt = String.format("%1$.2fkb/s", loadSpeed); } else if (result > 1024 * 1024) { loadSpeed = Math.round(result / 1024 / 1024); txt = String.format("%1$.2fM/s", loadSpeed); } return txt; } /** * 依据包名获取uid * */ private int getUIDFromPackageName(Context context,String packageName){ int uid=-1; PackageManager pManager=context.getPackageManager(); try { PackageInfo packageInfo=pManager.getPackageInfo(packageN af32 ame, PackageManager.GET_META_DATA); uid=packageInfo.applicationInfo.uid; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("zbv", "uid="+uid); return uid; } /** * Button * */ public void seekUidInfo(View view){ getTrafficsThroughUID(getUIDFromPackageName(this, et_uid.getText().toString())); } /** * 获取所有应用 * */ public void getAllApplication(){ PackageManager pManager=this.getPackageManager(); List<PackageInfo> list=pManager.getInstalledPackages(PackageManager.GET_META_DATA); StringBuffer sb=new StringBuffer(); for (PackageInfo packageInfo : list) { String pName=packageInfo.applicationInfo.packageName; sb.append(pName+"\n"); } tv_packageName.setText(sb.toString()); } }
设计的知识点归纳:
一、uid和uuid以及pid
PID和UID和UUID:PID:为Process Identifier,PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在android系统中一般不会把已经kill掉的进程ID重新分配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大。
UID:一般理解为User Identifier,UID在linux中就是用户的ID,表明时哪个用户运行了这个程序,主要用于权限的管理。而在android 中又有所不同,因为android为单用户系统,这时UID 便被赋予了新的使命,数据共享,为了实现数据共享,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID。(当然这也就表明了一个问题,android只能时单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。
因此在android中PID,和UID都是用来识别应用程序的身份的,但UID是为了不同的程序来使用共享的数据。
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。
二、我认为的重点
首先是通过包名获取uid方法为:getUIDFromPackageName(Context context,String packageName)然后就是检测移动网络的区分:checkNetworkConnected()
最后就是获取单个应用的流量统计:getTrafficsThroughUID(int uid)
注意的是:安卓23即以上即安卓6.0有另外一套api供更加全面友好的使用即:NetworkStatsManager
^–^
相关文章推荐
- 如何用ping 命令简单测试网速
- js实现简单网速测试方法
- 测试网站页面网速的一个简单Python脚本
- (转)如何用ping 命令简单测试网速
- Android复习练习三(安卓下简单JUnit测试)
- 如何用ping 命令简单测试网速
- js实现简单网速测试方法
- 如何用ping 命令简单测试网速
- android+app测试基础4+简单的安卓项目
- 用NAT123搭建内网WCF服务并实现安卓APP访问附带站点简单的性能测试
- 闰年测试非法输入的处理 简单安卓app 20150406
- 如何用ping 命令简单测试网速
- 压力测试、负载测试跟性能测试最简单的描述
- Jmeter Web 简单测试
- jest js 测试框架-简单方便人性化
- SharePoint SPQuery类简单测试
- 简单介绍安卓的活动及各种布局(8.18)
- 4.安卓中get和post的简单实现
- 小编教你如何测试你的网速