我已经搜索了很多关于这个。发现到处都是相同的代码,这部分地解决了目的。正如API文档所说,一旦设备重启,它将重置计数器。有时即使没有重启,计数器也会重置。下面是代码
float totalRxBytes = (float)TrafficStats.getTotalRxBytes()/(float)1048576; // Received
float totalTxBytes = (float)TrafficStats.getTotalTxBytes()/(float)1048576; // Sent
float mobRxBytes = (float)TrafficStats.getMobileRxBytes()/(float)1048576;
float mobTxBytes = (float)TrafficStats.getMobileTxBytes()/(float)1048576;
float wifiRxBytes = totalRxBytes - mobRxBytes;
float wifiTxBytes = totalTxBytes - mobTxBytes;
但是我想不出任何方法来获得特定日期或一个月的数据?请帮助。任何指示将不胜感激。谢谢。
首先,TrafficStats.getTotalRxPackets():
返回设备启动以来接收到的数据包数。
与TrafficStats.getTotalTxPackets()相同
这个类对于获取月份的统计信息没有帮助。
我建议解决方案从API 23:
NetworkStatsManager
该类可以获得每个设备或每个包的统计信息。对你特别有用的是function:
NetworkStatsManager.querySummaryForDevice ()
,其中测量开始时间为第三个参数,结束时间为第四个参数。
示例项目可以在这里找到。它展示了如何获得访问NetworkStatsManager请求适当的运行时权限。
此解决方案仅支持API 23+。
如果你真的想使用TrafficStats,那么创建一个服务,每小时获取TrafficStats. gettotalrxpackets()的结果,计算差异,每天将其保存在数据库的不同行
我同意R. Zagorski的观点,但我有一个不同的方法。
使用TrafficStats获取接收/发送的数据包数量,从中减去最后一个数量,然后使用SharedPreferences与最后一个数量一起保存。现在,为了处理设备重新启动,总是检查最近的计数是否大于当前的数量。如果是,则将最后一个数字重置为0。此外,要记录这个月的开始时间。一旦这个月结束,不要忘记将计数重置为0!
如果您也希望跟踪前一个月的计数,请使用List。当月份结束时,将总金额添加到月份号索引处的数组中。另外,请记住,第一个索引是0,而不是1。因此,您必须将数组偏移1个值,以便能够直接使用月份号来查询列表。
这比R. Zagorski的想法(这也很好)有一个优势,它可以从api级别8开始使用,因为这是TrafficStats的最低要求。
Hope I help:D