终极版:Andorid手机流量监测思路与代码实现(一)

首先,先上效果图:包括本月总的wifi流量和234g流量,同时能够统计出本日使用wifi和234g流量最多的APP,并且进行排序(事实上,实现了:每一个APP的每一天和手机总流量的数据都存在SQLite中,所以你想怎样显示就怎样显示)
左边是我自己写的demo,右边是某个APP,对比一下基本正确, 偏差是因为数据类型精确度不同,这个看你自己喜好

这里写图片描述

一、前期准备:
关于Android系统自带API,TrafficStack的使用,其中uid是指每个APP独一无二的标示,在Android中,第三方APP标志大于10000,如10021代表微信这个APP。

1、 getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFi
2、 getMobileTxBytes() //Mobile发送的总字节数
3、 getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等
4、 getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
5、getUidRxBytes(int uid) //获取某个网络UID的接受字节数
6、 getUidTxBytes(int uid) //获取某个网络UID的发送字节数

需要注意的是,上面的函数,只能计算本次开机都目前为止的流量情况,关机之后重新清零,数据存在文件夹中:
/proc/uid_stat/uid/tcp_send 上传流量
/proc/uid_stat/uid/tcp_rcv 下载流量

二、考虑的细节
利用上述API实现流量的统计,需要解决的问题有:
1、设定Service长期在后台监测本APP的流量情况,设定时间间隔差,如360的流量助手以3S为间隔;
2、解决后台服务被回收的问题(被回收后如何重新启动?如何能继续正确统计?);
3、如何区分出不同日期的流量使用情况?办法是利用数据库+间隔统计法;
4、开机要启动监听,网络状态变化要改变流量监听节约资源,关机要做标示,下次开机重新计算的时候,才知道要加上上次关机的流量值;
5、非正常关机状态,如死机拔掉电池;
6、如何统计3S内的流量差(wifi情况和234g情况)

以上六点,是做出本APP最主要的部分,看起来挺简单,但是细节上要多注意,对于Android四大组件的生命周期要有较好的把握,否则,算出来的数据不准确。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
。感谢您的提问。针对您的问题,可以使用以下代码将XML转换为JSON: ```java public static JSONObject xmlToJson(String xml) throws JSONException { JSONObject jsonObject = new JSONObject(); try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser parser = factory.newPullParser(); parser.setInput(new StringReader(xml)); parse(parser, jsonObject); } catch (XmlPullParserException | IOException e) { e.printStackTrace(); } return jsonObject; } private static void parse(XmlPullParser parser, JSONObject jsonObject) throws XmlPullParserException, IOException, JSONException { int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName; switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: tagName = parser.getName(); if (tagName.equalsIgnoreCase("item")) { jsonObject.put("item", parseItem(parser)); } break; case XmlPullParser.END_TAG: break; default: break; } eventType = parser.next(); } } private static JSONObject parseItem(XmlPullParser parser) throws XmlPullParserException, IOException, JSONException { JSONObject jsonObject = new JSONObject(); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName; switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: tagName = parser.getName(); if (tagName.equalsIgnoreCase("title")) { jsonObject.put("title", parseText(parser)); } else if (tagName.equalsIgnoreCase("link")) { jsonObject.put("link", parseText(parser)); } else if (tagName.equalsIgnoreCase("pubDate")) { jsonObject.put("pubDate", parseText(parser)); } break; case XmlPullParser.END_TAG: if (parser.getName().equalsIgnoreCase("item")) { return jsonObject; } break; default: break; } eventType = parser.next(); } return jsonObject; } private static String parseText(XmlPullParser parser) throws XmlPullParserException, IOException { String text = null; int eventType = parser.next(); if (eventType == XmlPullParser.TEXT) { text = parser.getText(); parser.nextTag(); } return text; } ``` 这段代码将XML数据解析为JSON对象,您可以将其用于您的Android应用的XML转JSON功能。 希望这些信息能够帮助到您。如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值