Узнайте, сколько сетевого трафика генерируют другие приложения для Android

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

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

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 нуждается в ресурсах) . Но это опять же не заводит меня далеко.

Любые идеи?


person iseeall    schedule 16.03.2011    source источник


Ответы (1)


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

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

person Idolon    schedule 16.03.2011
comment
Большое спасибо за ваш ответ! Думаю, это решает большую часть моей проблемы. Я только что нашел приложение NetSentry (исходный код), которое даже измеряет трафик без фоновая служба запущена. Теперь пытаюсь выяснить, могу ли я сделать то же самое, а также попытаться приписать трафик активности на переднем плане. - person iseeall; 17.03.2011