说到流量统计,可以利用Android官方提供的TrafficStats类,详见链接,其中主要API有:
static long getMobileRxBytes() //获取通过Mobile接收的字节总数,不包含WiFi
static long getMobileTxBytes() //获取通过Mobile发送的字节总数,不包含WiFi
static long getTotalRxBytes() //接收的字节总数,包含Mobile和WiFi等
static long getTotalTxBytes() //发送的字节总数,包含Mobile和WiFi等
static long getUidRxBytes(int uid) //获取uid所代表的APP接收的字节数,包含Mobile和WiFi等
static long getUidTxBytes(int uid) //获取uid所代表的APP发送的字节数,包含Mobile和WiFi等
需要注意的是,这些方静态法统计的都是从上次开机到当前时间的流量值,也就是说,每次关机后流量数据都会被清零。本阶段,主要看这两个静态方法getUidRxBytes(int uid)和getUidTxBytes(int uid)。而APP的uid,可以通过应用的包名得到ApplicationInfo,然后再从ApplicationInfo中提取它的uid(PackageManager和ApplicationInfo)。最后只要将得到的RxBytes和TxBytes相加就得到APP所使用的流量了。此处,我们是以JDK的形式集成到APP中,所以可以直接用android.os.Process.myUid()来获取APP的uid。
1、获取流量代码
获取第三方APP的流量:
PackageManager pm = context.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo("com.netease.bimdesk", PackageManager.GET_ACTIVITIES);
long rxBytes = TrafficStats.getUidRxBytes(ai.uid);
long txBytes = TrafficStats.getUidTxBytes(ai.uid);
long totalBytes = rxBytes + txBytes;
获取自身流量:
int uid = android.os.Process.myUid();
long rxBytes = byteToMB(mNetUtils.getUidRBytes(uid));
long txBytes = byteToMB(mNetUtils.getUidTBytes(uid));
long totalBytes = rxBytes + txBytes;
2、区分Wifi和非WiFi中的流量使用
因为getUidRxBytes(int uid)和 getUidTxbytes(int uid)包括了所有网络形式的流量,即包括WiFi和4g/3g。因此可以监听WiFi的变化,并利用数据库来记录WiFi/非WiFi过程中该APP使用的流量。
public class WifiStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
if (wifistate == WifiManager.WIFI_STATE_DISABLED) {//关闭WiFi
//记录本次WiFi过程中APP消耗的流量
} else if (wifistate == WifiManager.WIFI_STATE_ENABLED) {//打开WiFi
//记录本次非WiFi过程中APP消耗的流量
}
}
}
}
3、记录App关机流量使用
如上所述,getUidRxBytes(int uid)和getUidTxbytes(int uid)记录的是该APP在手机启动到当前时间的流量值,而手机关机时还需要记录APP使用的流量,也可以利用数据库和广播机制来记录。
public class ShutDownReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_SHUTDOWN)) {//关机
//在关机时记录APP消耗的流量
}
}
}
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者冯超授权发布。