Я пытаюсь создать фоновую службу, которая должна измерять использование трафика различными приложениями, чтобы иметь возможность показать пользователю, какие приложения потребляют больше всего трафика данных.
Я обнаружил, что приложение 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 нуждается в ресурсах) . Но это опять же не заводит меня далеко.
Любые идеи?