我试图在每个应用程序的基础上找出Android上的数据使用情况.像Android数据使用应用程序和配额/上限监视器小部件:永远不会收取额外的数据或再次上限!.
我查看了Stack Overflow问题如何在Android环境中检测数据使用情况.
但它并没有多大帮助.
ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo( mInfo );
List<RunningAppProcessInfo> listOfRunningProcess = activityManager.getRunningAppProcesses();
Log.d(TAG, "XXSize: " + listOfRunningProcess.size());
for (RunningAppProcessInfo runningAppProcessInfo : listOfRunningProcess) {
if (runningAppProcessInfo.uid > 1026)
{
Log.d(TAG, "ANS " + runningAppProcessInfo.processName +
" Id :" + runningAppProcessInfo.pid +
" UID: " + runningAppProcessInfo.uid);
}
}
Run Code Online (Sandbox Code Playgroud)
我按照Akos Cz的建议尝试了上面的代码.但是,与上面提到的不同,所有UID都是数字app_79.这样可以吗?
Linux文件/ proc/net/dev读取如下:
[me@host ~]$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
Run Code Online (Sandbox Code Playgroud)
字段下降和错误是什么意思?
一些ERRS包也算在下降包?
为什么数据包被认为是错误的,是因为它遭受校验和错误?
为什么丢包?是因为系统没有足够的缓冲区,因为NIC上有一些突发?
难道这两个领域采取发往另一个主机的数据包(例如,当网卡处于混杂模式下工作)为考虑的?
在Android 4.0以上,我们在手机中有数据使用控制选项.请查看随附的屏幕截图以进一步了解.
http://developer.android.com/about/versions/android-4.0-highlights.html
现在我需要从我的应用程序中检查这些内容(特定时间段/特定日期内所有应用程序的数据使用情况).我怎样才能做到这一点?我也使用以下类来了解网络使用情况.
http://developer.oesf.biz/em/developer/reference/eggplant/android/net/NetworkStatsHistory.html
请检查以下链接图像.我需要开发相同类型的应用程序.
http://developer.android.com/sdk/images/4.0/usage-all-lg.png
http://developer.android.com/sdk/images/4.0/usage-maps-lg.png
感谢您分享您的代码,但我需要知道每个应用程序使用的数据而不是所有应用程序.到目前为止,我在链接中观察到没有人在讨论各个应用程序的数据使用情况.我已经知道如何在设备中显示已安装的应用程序.现在我想知道每个应用程序使用的数据是什么.
我使用以下代码列出设备中已安装的应用程序列表.
private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
ArrayList<PInfo> res = new ArrayList<PInfo>();
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
for (int i=0; i<packs.size(); i++) {
PackageInfo p = packs.get(i);
if ((!getSysPackages) && (p.versionName == null)) {
continue ;
}
PInfo newInfo = new PInfo();
newInfo.setAppname(p.applicationInfo.loadLabel(getPackageManager()).toString());
newInfo.setPname(p.packageName);
newInfo.setVersionName(p.versionName);
newInfo.setVersionCode(p.versionCode);
newInfo.setIcon(p.applicationInfo.loadIcon(getPackageManager()));
res.add(newInfo);
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
我如何知道每个应用程序使用的数据是什么?
实际上,我需要一个解决方案,在给定的时间段内(即两天之间)提供应用程序的数据使用.
我知道我们可以通过使用类似的东西(在过去,在这里询问)来获取指定应用程序的网络使用情况(到目前为止,从某个特定时间到目前为止移动和Wifi的总带宽使用量):
private final static int[] NETWORKS_TYPES = new int[]{ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_MOBILE};
long rxBytes=0L, txBytes=0L;
final TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
final String subscriberId = telephonyManager.getSubscriberId();
final ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
final int uid = applicationInfo.uid;
for (int networkType : NETWORKS_TYPES) {
final NetworkStats networkStats = networkStatsManager.queryDetailsForUid(networkType, subscriberId, 0, System.currentTimeMillis(), uid);
final Bucket bucketOut = new Bucket();
while (true) {
networkStats.getNextBucket(bucketOut);
final long rxBytes = bucketOut.getRxBytes();
if (rxBytes >= 0)
totalRx += rxBytes;
final long txBytes = bucketOut.getTxBytes(); …Run Code Online (Sandbox Code Playgroud)