Как заставить процессор "спать", когда экран отключен в Android?

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

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

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

Ответы

Ответ 1

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

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

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

и

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

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

Ответ 2

Возьмите 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();