Узнайте, сколько сетевого трафика генерируют другие приложения для Android - PullRequest
4 голосов
/ 16 марта 2011

Я пытаюсь создать фоновый сервис, который должен измерять использование трафика различными приложениями, чтобы иметь возможность показать пользователю, какие приложения потребляют большую часть трафика данных.

Я обнаружил, что приложение Spare Parts делает именно это, но после его установки на устройство Dell Streak 1.6, я всегда получаю «Нет данных об использовании батареи» для «Использование сети». Эта функция вообще работает в Запасных частях? Также я не смог найти рабочий исходный код для Spare Parts.

https://android.googlesource.com/platform/development/+/froyo-release/apps/SpareParts
выглядит устаревшим или неполным. (?)

Но Запасные части, кажется, измеряют, например, Загрузка процессора на приложение. Как это сделать на телефоне без рута?

Моя общая идея о том, как можно измерить трафик на приложение, состоит в том, чтобы регулярно проверять

"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, как получить информацию о том, какая активность отображается в данный момент (в подписи)?

но, похоже, речь идет о тестировании, а не только о сторонней службе, работающей на нерутируемом устройстве Android.

Мы можем узнать, какие действия выполняются с помощью ActivityManager.getCurrentTasks(), но любой из них может быть тем, на котором сосредоточено внимание. Похоже, что архитекторы Android явно не хотят, чтобы сторонние приложения знали, на что они нацелены, из соображений безопасности

(см. http://android.bigresource.com/Track/android-zb2mhvZX4/).

Есть ли способ обойти это?

Кроме того, если я хочу не только определить, какие действия поглощают трафик, но также и какие службы, я могу получить все запущенные в данный момент службы с ActivityManager.getCurrentSerives() и даже посмотреть для каждого, находится ли он в режиме переднего плана (в отличие от того, чтобы быть выброшенным, если Android нужны ресурсы). Но это опять-таки меня не подводит.

Есть идеи?

1 Ответ

3 голосов
/ 17 марта 2011

Вы можете определить текущее приложение переднего плана с помощью вызова ActivityManager.getRunningAppProcesses. Он вернет список RunningAppProcessInfo записей. Чтобы определить, какое приложение находится на переднем плане, проверьте поле RunningAppProcessInfo.importance на равенство RunningAppProcessInfo.IMPORTANCE_FOREGROUND.

Но учтите, что вызов метода ActivityManager.getRunningAppProcesses() должен выполняться НЕ в потоке пользовательского интерфейса. Просто вызовите его в фоновом потоке (например, через AsyncTask), и он вернет правильные результаты. Проверьте мой пост для получения дополнительной информации.

...