(我认为这是一个常见的问题,但请不要太快,因为我相信我的答案会为讨论添加一些新内容.)
相关的API是TrafficStats,它从例如它获取数据.的/ proc / uid_stat /.
统计数据必须包括GCM等,而不仅仅是我发起的东西,因此基于线程和标记的计数器是不够的.
第一个问题是基于UID(即每个应用程序)获得移动数据使用的API显然不存在.有getMobile API和getUid API,但没有任何组合它们.我建议在下面给出一个解决方案.
更重要的是,我得到的印象是TrafficStats有太多的bug可用于这个通用目的.我把它作为一个可能的答案,如果这被接受,那么最好的解决方案是手动计算数据使用量.
解决方法
这是我最初的解决方案. API实际上是以多种方式打破的,包括旧的和新的,所以这只是一个解决方案,如果它们被修复就可以使用.
int uid = android.os.Process.myUid(); txBytesInitial = TrafficStats.getUidTxBytes(uid); rxBytesInitial = TrafficStats.getUidRxBytes(uid);
因此,每次网络连接丢失(或应用程序关闭,或应用程序逻辑需要统计数据)时,应用程序数据使用中的增量将根据NetworkInfo.getType()添加到您的统计信息中.您需要维护最后检索以用于增量计算,并且这些需要存储在例如:当手机重新启动或任何方向错误时,SharedPreferences并重置(取决于设备,由于其他原因可以重置,然后重启).
有关这些API的一些附加说明,请参见this useful SO post(例如,它们不包括数据包开销,只包括有效负载).