Держите Android в активном состоянии для входящих сетевых подключений?

Я пишу HTTP-сервер для Android-устройств, реализованный через NanoHTTPD.

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

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

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

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

Спасибо!

РЕДАКТИРОВАТЬ: для целей этого вопроса разрядкой батареи можно пренебречь.

РЕДАКТИРОВАТЬ: NanoHTTPD также работает как служба.


person bob    schedule 02.01.2015    source источник
comment
что вы имеете в виду прослушивание входящих соединений, это похоже на прослушивание входящих вызовов? я не очень понимаю цель прослушивания соединения   -  person Ahmad Sanie    schedule 02.01.2015
comment
@AhmadAlsanie Я имею в виду, что примерно через 1 минуту бездействия устройство перестает отвечать на все входящие сетевые подключения, даже с блокировкой Wi-Fi и вейклоками. Сеть как в wifi, не LTE. Цель прослушивания соединения состоит в том, что это сервер, и это то, что делают серверы.   -  person bob    schedule 02.01.2015
comment
Вы когда-нибудь догадывались об этом?   -  person Michael    schedule 18.09.2015
comment
Я понял это сейчас @Michael   -  person Chris    schedule 03.12.2015


Ответы (1)


Вам нужно следующее:

  • Служба переднего плана
  • Блокировка Wi-Fi
  • Блокировка процессора

Неполные фрагменты (например, отсутствие услуг/отказ от блокировок):

    // Keep the CPU awake.
    powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Httpd");
    wakeLock.acquire();

    // Keep the wifi awake.
    WifiManager wm = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
    wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "Httpd");
    wifiLock.acquire();
person Chris    schedule 02.12.2015