Как уберечь процессор от "сна" при выключенном экране в Android?

У меня есть приложение, в котором я отправляю данные по сети через WiFI. Все хорошо, пока я не выключу дисплей или устройство не перейдет в "спящий режим". Я уже блокирую WiFi, однако, похоже, что в спящем режиме скорость процессора снижается, что приводит к тому, что потоковая передача не работает должным образом (то есть пакеты не передаются так быстро, как хотелось бы, когда устройство не спит).

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

Есть ли способ "не дать процессору перейти в" спящий режим "при выключенном экране"? Если так, то как? Если нет, то какой-нибудь совет, как поддерживать постоянную скорость моего потока WiFi, находится ли устройство в спящем режиме или нет?

2 ответа

Решение

Итак, после гораздо большего количества исследований и экспериментов, похоже, что реальная проблема заключается в том, что, по крайней мере, на некоторых телефонах их WiFi переходит в режим "частичного сна", ДАЖЕ, если вы взяли блокировку WiFi. Похоже, это то, для чего был изобретен флаг 'WIFI_MODE_FULL_HIGH_PERF' при взятии блокировки WiFi... к сожалению, этот флаг доступен только на некоторых устройствах / версиях Android (я понятия не имею, к какому, но он не был доступен мне). Поэтому, это не исправление для всех устройств.

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

Как сохранить задачу в живых после того, как телефон спит?

а также

http://android.modaco.com/topic/330272-screen-off-wifi-off/

Я надеюсь, что это поможет людям, которые испытывают сбои WiFi, когда телефон переходит в спящий режим / экран выключен (и телефон отключен / отключен [например, вы не увидите этот эффект при подключении к adb; только когда телефон работает) с этим ничего не связано]).

Возьмите PARTIAL_WAKE_LOCK из PowerManager. Вам также необходимо добавить разрешение WAKE_LOCK в свой манифест.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Tag"); 
wl.acquire();
//do what you need to do
wl.release(); 
Другие вопросы по тегам