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