当前位置:首页 > Android流量网络监控设计(超级实用版)
第四章Android系统网络流量监控具体实现及相关分析
部分实现代码如下:
logButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) { });
parseHandler = new Handler() {
public void handleMessage(Message msg) { };
new ParseThread(parseHandler).start(); }
Intent intent = new Intent();
intent.setClass(MainActivity.this, LogActivity.class); intent.putExtra(\startActivity(intent); }
4.3.2 LogActivity类的数据适配
LogActivity是一个继承于ListActivity的子类,即一个以列表形式展现屏幕内容的Activity,它也是Activity的一个子类,同时本身还实现了关于List操作的众多接口。该ListActivity在屏幕上设置一个ListView控件来布局,这需要在其使用的布局xml文件中包含一个id为\的ListView来实现。同时,还要通过setListAdapter(new LogAdapter(this,size))方法传入一个BaseAdapter对象实例来完成每一条数据内容与ListView的每个条目的适配工作。
Adapter适配器在Android应用程序中起着非常重要的作用,应用也非常广泛,它可以被看作是数据源和UI组件之间的桥梁,而BaseAdapter是Android应用程序中经常使用到的基础数据适配器,它的主要用途是将一组数据传到ListView、Spinner、Gallery及GridView等UI界面组件中完成适配。要实现自定义的BaseAdapter适配器类需要复写该类中的getCount()方法和getView()方法,getCount()方法指示一共有多少个条目需要适配,getView()方法配置每个条目显示的具体视图对象。
我们自定义了一个继承自BaseAdapter基类的适配器类LogAdapter来完成数据的适配工作。该适配器类通过getCount()方法返回一个size变量判断一共有
25
电子科技大学学士学位论文
多少条内容条目需要布局,该size变量值即是之前传递过来的解析的网络流量包数量大小。然后通过getView()方法来配置每个条目的内容,具体实现是打开\目录下的capture.txt文件(即存放Pcap文件解析结果的流量日志文件)的输入流,依次读取一行文本(对应一条流量日志信息),设置为每个条目的TextView所要显示的文本内容,直到读取完最后一行,关闭该输入流对象资源,就完成了日志流量信息与ListView每个内容条目的适配工作。
LogAdapter的部分核心代码如下: public class LogAdapter extends BaseAdapter{ }
流量日志模块LogActivity的界面效果如下图:
public View getView(int position, View arg1, ViewGroup arg2) { }
LayoutInflater layoutInflater = LayoutInflater.from(context); view = layoutInflater.inflate(R.layout.log_item, null); TextView item = (TextView)view.findViewById(R.id.item); item.setText(br.readLine()); return view; public int getCount() { }
return size;
public LogAdapter(int size){ }
this.size = size;
br = new BufferedReader(new FileReader(f)); private int size;
private File f = new File(\private BufferedReader br = null;
26
第四章Android系统网络流量监控具体实现及相关分析
图4-3 流量日志界面图
4.4 流量统计界面模块的实现 4.4.1 流量统计的实现方法
本应用程序还同时实现了计算每个应用进程在网络流量监控模式阶段的总通信流量(分为上行流量和下行流量)的功能,具体是通过使用Android SDK的包管理器PackageManager类和自带的流量统计工具类TrafficStats类来实现的。
PackageManager相关类API是对所有基于加载信息的数据结构的封装,包括以下功能:
(1) 安装,卸载应用;
27
电子科技大学学士学位论文
(2) 查询应用权限的相关信息; (3) 查询Application的相关信息; (4) 查询已安装应用; (5) 增加,删除应用权限;
(6) 清除用户数据、缓存、代码段等。
对于Android系统的流量统计来说,Google在2.2版本中新加入了TrafficStats这个类用来直接获取流量统计信息,而TrafficStats类实质上也是通过读取Linux提供的文件对象系统类型的文本进行解析流量统计信息的。TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为 long型,如果返回等于-1代表 UNSUPPORTED,即当前设备不支持统计。常用静态方法有:
static long getTotalRxBytes() //获取总的接受字节数 static long getTotalRxPackets() //获取总的接受数据包数 static long getTotalTxBytes() //获取总的发送字节数 static long getTotalTxPackets() //获取总的发送数据包数
static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数 static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数 本应用程序实现流量统计功能的具体思路是:首先通过PackageManager类的getInstalledPackages(PackageManager.GET_PERMISSIONS)方法获取Android系统中所有具有联网权限的应用包信息,然后通过使用TrafficStats类的静态方法getUidRxBytes(int uid)和getUidTxBytes(int uid),可以获取某个网络UID(即某个应用进程)在某个时间点的接收字节数和发送字节数,于是在开启和关闭网络流量监控模式时分别调用一次该方法,将两个时间点的接收(或发送)字节数相减,即可得到这段时间内的下行(或上行)流量。
4.4.2 TrafficActivity类的数据适配
当点击trafficButton时,会执行监听器的OnClick()方法,通过一个Intent对象启动另一个Activity即显示流量统计的界面TrafficActivity类的实例,同时将每个应用进程的上行流量和下行流量数据传递过去。这个数据是通过java的容器HashMap类封装起来的,HashMap是一个以键值对的存储形式来存放数据的数据结构,是java中最常用的容器类,它通过put(String key, String value)方法来存入键值对,通过get(String key)方法来根据键获取相应的值,同时还有一个size()方法可
28
共分享92篇相关文档