6

我对此进行了很多搜索。到处都找到了相同的代码,部分解决了这个目的。正如 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;  

但是我想不出任何方法来获取特定日期或一个月的这些数据?请帮忙。任何指针将不胜感激。谢谢。

4

2 回答 2

5

首先,TrafficStats.getTotalRxPackets()

返回自设备启动后收到的数据包数。

TrafficStats.getTotalTxPackets()也是如此

此类对于获取月份统计数据没有帮助。

我会建议使用 API 23 的解决方案:

网络统计管理器

此类有可能获得每个设备或每个包的统计信息。对您特别有帮助的是功能:

NetworkStatsManager.querySummaryForDevice()

期望测量开始时间作为第三个参数,结束时间作为第四个参数。

示例项目可以在这里找到。它显示了如何获得对NetworkStatsManager的访问权限,要求适当的运行时权限。

此解决方案仅 API 23+。

如果您真的想使用TrafficStats,那么创建一个服务,每小时都会获得TrafficStats.getTotalRxPackets()的结果,计算差异,每天将其保存在不同行的数据库中。

于 2016-10-18T07:11:20.873 回答
1

我同意 R. Zagorski 的观点,但我有不同的方法。

使用TrafficStats获取接收/发送的数据包数量,从中减去最后一个数量,然后使用SharedPreferences将其与最后一个数量一起保存。现在,要处理设备重启,请始终检查最后一个计数是否大于当前数量。如果是,请将最后一个金额重置为 0。此外,请跟踪月份的开始时间。当月结束时,不要忘记将计数重置为 0!

如果您还希望跟踪上个月的计数,请使用列表。当月份结束时,将总金额添加到月份编号索引处的数组中。另外,请记住,第一个索引是 0,而不是 1。因此,您必须将数组偏移 1 个值才能直接使用月份编号来查询您的列表。

这比 R. Zagorski 的想法(这也相当不错)有一个优势,它可以从 api 级别 8 开始使用,因为这是 TrafficStats 的最低要求。

希望我有所帮助:D

于 2016-10-23T14:45:45.567 回答