определить текущее состояние конечного автомата радиосвязи 3G/WIFI на устройстве Android

мое приложение постоянно получает обновления местоположения и обновления распознавания активности и время от времени отправляет одним пакетом все собранные записи активности и местоположения на сервер.

Я знаю, что каждый раз, когда я выполняю сетевые операции - состояние радиосвязи WIFI или мобильного телефона (зависит от того, какое текущее активное соединение) переходит в активное состояние и некоторое время остается в режиме ожидания - что может резко повлиять на использование батареи, когда выполнять частые сетевые запросы, поэтому я планирую будильник для выполнения синхронизации с сервером только один раз в 2 часа или когда пользователь явно использует мое приложение.

с другой стороны, мы хотели бы синхронизировать собранные данные с сервером через гораздо более короткие промежутки времени, если это возможно.

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

мои вопросы:

  • можно ли обнаружить это состояние радио, как я описал?
  • если да, то как? и как вы думаете, это хорошая идея сделать это?

Я ожидал, что новый JobScheduler, представленный в Android 5.0, будет поддерживать планирование заданий, когда сетевое радио активно, но, похоже, это не так в соответствии с API. Я считаю, что он будет объединять все задания, требующие сети, одновременно, но это будет хорошо только в идеальном мире, когда все приложения на устройстве будут использовать его с умом.


person Tal Kanel    schedule 21.10.2014    source источник


Ответы (2)


Короткий ответ: нет, в настоящее время вы не можете определить текущее состояние сетевого адаптера.

Android не позволяет так глубоко проникнуть в систему. Однако вы можете самостоятельно оценить состояние, просматривая значения в этих четырех файлах:

/sys/devices/virtual/net/<InterfaceName>/statistics/tx_packets
/sys/devices/virtual/net/<InterfaceName>/statistics/rx_packets
/sys/devices/virtual/net/<InterfaceName>/statistics/tx_bytes
/sys/devices/virtual/net/<InterfaceName>/statistics/rx_bytes

Вы можете прочитать текущий трафик этих файлов и сопоставить его с соответствующей моделью состояния используемого сетевого адаптера. Однако модель сильно различается для Wi-Fi, UMTS, LTE и т. д. ) можно посмотреть конечный автомат для Wifi и 3G с условиями перехода и таймингами (найдены опытным путем).

В большинстве случаев лучше придерживаться советов по использованию сети, предоставленных страницы разработчиков Android. Честно говоря, я тоже помню, что читал что-то о сетевом таймере, но больше не могу найти источник.

Изменить: я нашел недостающий источник: Project Volta был представлен в Android 5.0, предлагая вам дополнительные функции батареи.

person nico.ruti    schedule 11.01.2015

Мне было интересно узнать об этом же, и я, наконец, нашел ответ здесь: http://android.xsoftlab.net/training/efficient-downloads/connectivity_patterns.html

Идея состоит в том, чтобы использовать ConnectivityManager следующим образом:

connectivityManager.addDefaultNetworkActiveListener(new OnNetworkActiveListener() {
            @Override
            public void onNetworkActive() {
                // PREFETCH HERE
            }
});

Однако мне еще предстоит попробовать.

person Dan    schedule 13.12.2017