android - 查看其他 Android 应用产生的网络流量

标签 android android-activity focus traffic measure

我正在尝试制作一个后台服务,该服务应该测量各种应用程序的流量使用情况,以便能够向用户显示哪些应用程序消耗了最多的数据流量。

我发现 Spare Parts 应用程序正是这样做的,但在 1.6 Dell Streak 设备上安装它后,我总是得到“没有可用的电池使用数据”的“网络使用情况”。此功能在 Spare Parts 中是否有效? 另外,我找不到 Spare Parts 的工作源代码。

https://android.googlesource.com/platform/development/+/froyo-release/apps/SpareParts
看起来过时或不完整。 (?)

但是 Spare Parts 似乎可以测量例如每个应用程序的 CPU 使用率。它是如何在无根电话上做到这一点的?

关于如何衡量每个应用程序的流量,我的一般想法是定期检查

"sys/class/net/"+ sWiFiInterface + "/statistics/rx_bytes"

"sys/class/net/"+ sWiFiInterface + "/statistics/tx_bytes"

"sys/class/net/"+ sMobileInterface + "/statistics/rx_bytes"

"sys/class/net/"+ sMobileInterface + "/statistics/tx_bytes"

文件并查看哪个应用当前具有焦点,因此最有可能导致生成的网络流量。

不幸的是,我找不到如何让应用程序当前获得焦点。

我发现了这个:

Android, how to get information on which activity is currently showing (in foregorund)?

但它似乎是关于测试的,而不仅仅是在非 root Android 设备上运行的 3d 派对服务。

我们可以使用 ActivityManager.getCurrentTasks() 获取正在运行的 Activity ,但其中任何一个都可以成为焦点。出于安全考虑,Android 架构师似乎明确不希望 3d 方应用程序知道哪个应用程序具有焦点

(参见 http://android.bigresource.com/Track/android-zb2mhvZX4/)。

有解决办法吗?

此外,如果我不仅想检测哪些 Activity 占用了流量,还想检测哪些服务占用了流量,我可以获取所有当前正在运行的服务 ActivityManager.getCurrentSerives() 甚至查看每一个是否处于前台模式(不像在 Android 需要资源时被抛出)。但这又没有让我走多远。

有什么想法吗?

最佳答案

您可以使用 ActivityManager.getRunningAppProcesses 调用检测当前前台应用程序。它将返回 RunningAppProcessInfo 记录列表。要确定哪个应用程序在前台,请检查 RunningAppProcessInfo.importance 字段是否等于 RunningAppProcessInfo.IMPORTANCE_FOREGROUND

但请注意,对 ActivityManager.getRunningAppProcesses() 方法的调用必须在 UI 线程中执行。只需在后台线程中调用它(例如通过 AsyncTask),它就会返回正确的结果。检查my post了解更多详情。

关于android - 查看其他 Android 应用产生的网络流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5327985/

相关文章:

java - 在 Android 应用发送的 HTTP 请求之间维护 cookie

java - 如何在不显示黑屏的情况下掩盖来自android服务器的响应所花费的时间?

android - 为什么在以下情况下不调用 "onPause"?

android - Logcat 分析问题

javascript - 如何在焦点上显示占位符文本?

web - 如果元素从网页上消失,焦点应该放在什么地方

android - fragment 中的 AsyncTask 不更新 UI

java - 在android项目中将所有名称变量和函数从大写更改为小写

android - 如何从堆栈中删除特定 Activity ?

java - 窗口/舞台失去焦点时的事件