翻译自http://stackoverflow.com/questions/12613402/android-statistic-3g-traffic-for-each-app-how
想要统计每一个APP的流量使用,我现在使用的是Android TrafficStats
然后我可以得到类似与以下的结果:
- Youtube 50.30 MBytes
- Facebook 21.39 MBytes
- Google Play 103.38 MBytes
(and more…)
我所知道的是,“Android TrafficStat”只是一个指向c文件的指针。(或者是.so?)
但得到的结果是wifi&3g混合的结果,有没有得到没有wifi的流量信息的方法呢?
回答
我有一个方法。。。。
首先创建一个class,继承BroadcasrReceiver
清单文件
<receiver android:name=".core.CoreReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
代码
/**
* @author me
*/
public class CoreReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (Constants.phone == null) {
// Receive [network] event
Constants.phone=new PhoneListen(context);
TelephonyManager telephony=(TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(Const
创建一个phone stats listener
public class PhoneListen extends PhoneStateListener {
private Context context;
public PhoneListen(Context c) {
context=c;
}
@Override
public void onDataConnectionStateChanged(int state) {
switch(state) {
case TelephonyManager.DATA_DISCONNECTED:// 3G
//3G has been turned OFF
break;
case TelephonyManager.DATA_CONNECTING:// 3G
//3G is connecting
break;
case TelephonyManager.DATA_CONNECTED:// 3G
//3G has turned ON
break;
}
}
}
最后,我的逻辑是:
1 连接数据库
2 通过TrafficStats 统计流量数据(每一分钟),当且仅当3g开的时候才统计
3 如果3g关了,停止统计
4 如果3g&wifi都开着,停止统计
据我所知,如果3g&wifi都开着,只跑wifi流量