我已经搜索了很多关于此的内容。在任何地方找到相同的代码,部分地解决了目的。正如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;
但我无法找出从特定日期或一个月获得此数据的方法吗?请帮忙。任何指针将不胜感激。 感谢。
答案 0 :(得分:4)
首先,TrafficStats.getTotalRxPackets():
返回自设备启动以来收到的数据包数。
与TrafficStats.getTotalTxPackets()
相同此课程对获取月份统计信息没有帮助。
我建议使用API 23解决方案:
此类可以获取每个设备或每个包的统计信息。特别有用的功能是:
NetworkStatsManager.querySummaryForDevice()
期望测量开始时间为第三参数,结束时间为第四参数。
可以找到示例项目here。它显示了如何获取NetworkStatsManager的访问权,要求适当的运行时权限。
此解决方案仅为API 23 +。
如果您真的想使用TrafficStats,那么创建一个每小时都会得到TrafficStats.getTotalRxPackets()结果的服务,计算差异,将其保存在每天不同行的数据库中。
答案 1 :(得分:0)
我同意R. Zagorski,但我有一个不同的方法。
使用TrafficStats获取/发送的数据包数量,从中减去最后一个数量,然后使用SharedPreferences和最后一个数量保存。现在,要处理设备重启,请始终检查最后一次计数是否大于当前数量。如果是,则将最后一个金额重置为0.此外,记录月份开始的时间。月份结束后,不要忘记将计数重置为0!
如果您希望跟踪上个月的计数,请使用列表。当月份结束时,将总金额添加到月份编号索引处的数组中。另外,请记住第一个索引是0而不是1.因此,您必须将数组偏移1值才能直接使用月份数来查询列表。
这比R. Zagorski的想法(也非常好)更有优势,它可以从api级别8使用,因为它是TrafficStats的最小值。
希望我帮助过:D