Google在android2.2以上版本提供了android.net.TrafficStats类,来获取wifi,3G数据。
Android 4.0开始引入流量监控的特性。他可以监控所有的数据流量,支持警告和限制流量使用。当超过特定quota值时,会触发notification或者禁止移动网络。流量监控可以追追踪每个应用的历史数据。用户可以限制特定的应用在后台运行时是否可以联网。
通过设备dev_get_stats()返回的rx_bytes和tx_bytes来统计数据流量。新加入的device应该有这样的特性,在dev_get_stats()中返回值不应包括底层的数据。
Android Framework从ConnectivityService中的NetworkStateTracker来为每个network interface统计数据。这样就保证了framework可以具体的分辨每个network interface,包括type和sim卡身份证等。
流量重置的日期设置,一般是在设定日期的end at midnight UTC。当一个月日期不到设定日期时,从下个月1日开始重置,比如2月份没有30日,则从3月1日重新算流量。
DataUsage Tag 是流量监控的一个维度,默认based on the UID。
流量监控主要用到的类
android.net.NetworkStats:
所有活动网络分析的收集,包括了所有网络接口的总结细节,也可以从单个UID的粒度上来分析。在内部将这些分析数据作为一个大表存储,格式和/proc中的数据格式很接近,这种格式特地为内存内的比较进行了优化,持久化存储的时候可以考虑使用NetworkStatsHistory。前台数据,后台数据
具体参见 官方英文文档 要翻墙
MTK支持双卡,因此流量统计需要使用一点不一样的私有接口。
首先跟踪系统源码,具体实现代码位于
packages/app/Settings 里。
实现的类是
com.mediatek.datausage.OverViewTabAdapter
里面有关于wifi和流量的统计,下面剥离下其实现,非完整可用代码
//获取网络状态服务
android.net.INetworkStatsService
mStatsService = INetworkStatsService.Stub.asInterface(
ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
//打开会话
android.net.INetworkStatsSession mStatsSession = mStatsService.openSession();
//获取wifi的流量情况
android.net.NetworkStatsHistory network = mStatsSession.getHistoryForNetwork(
android.net.NetworkTemplate.buildTemplateWifiWildcard(), FIELD_RX_BYTES
| FIELD_TX_BYTES);
//...具体计算略
//获取数据流量情况需要获取各自的sim卡
List<SubscriptionInfo> mSublist = android.telephony.SubscriptionManager.from(mContext).getActiveSubscriptionInfoList();
for (SubscriptionInfo subInfo : mSublist) {
String subscriberId = TelephonyManager.from(mContext).getSubscriberId(subInfo.getSubscriptionId());
android.net.NetworkTemplate template = android.net.NetworkTemplate.buildTemplateMobileAll(subscriberId);
android.net.NetworkStatsHistory network = mStatsSession.getHistoryForNetwork(template,
FIELD_RX_BYTES | FIELD_TX_BYTES);
//具体计算略...
}