Цель WakeLock в современном Android?

Мне трудно понять назначение WakeLock в современных версии Android после введения Doze и Foreground Services.

Похоже, что на данный момент WakeLocks в значительной степени устарели (хотя и не помечены как устаревшие), заменены Foreground Services (поскольку WakeLocks на самом деле не соблюдаются Дремать).

Из документации: "Один законный случай использования блокировки пробуждения может быть фоновой службой которому нужно захватить блокировку пробуждения, чтобы ЦП продолжал работать, пока экран выключен ». Но это уже не так после введения служб doze и foreground, не так ли?

Есть ли законный вариант использования WakeLocks (вместо, например, службы переднего плана)?


person user1202032    schedule 31.10.2018    source источник


Ответы (1)


Службы переднего плана по-прежнему не держат ЦП в бодрствующем состоянии — для этого вам все еще нужен wakelock. В таких случаях, как текущее воспроизведение мультимедиа, потребуются как служба переднего плана (для поддержания процесса в рабочем состоянии и разрешения пробуждения, пока остальная часть системы дремлет), так и сама активация (для продолжения фактического воспроизведения мультимедиа).

person ianhanniballake    schedule 01.11.2018
comment
Что же означает на самом деле, чтобы процессор не спал? Если у вас есть фоновая служба, пробуждение не будет поддерживать ее работу. Если у вас есть служба переднего плана, служба переднего плана позволит вам запускать код без пробуждения. - person user1202032; 01.11.2018
comment
Это два совершенно разных слоя. Службы переднего плана влияют только на приоритет процесса вашего приложения, которое влияет только на то, что происходит при нехватке памяти. Это полностью отличается от того, задерживается ли сообщение, отправленное обработчику, до тех пор, пока какое-либо другое приложение не разбудит ЦП, или MediaPlayer продолжает обрабатывать потоковые данные. - person ianhanniballake; 01.11.2018
comment
Конечно, но я не думаю, что это действительно так. Если wakelocks не предотвращает уничтожение вашего сервиса, я все равно не вижу смысла запрашивать его в приложении. Если у вас есть служба переднего плана, вас (предположительно) не убивают, и вы можете непрерывно выполнять код. В документах служба переднего плана указывается как способ выполнения длительных операций в фоновом режиме. - person user1202032; 01.11.2018
comment
Конкретные компоненты Android (MediaPlayer, LocationListener, BluetoothAdapter) ведут себя по-разному, независимо от того, удерживается блокировка пробуждения или нет. - person user1202032; 01.11.2018
comment
Причина, по которой setWakeMode существует и ExoPlayer специально вызывает пробуждения потому, что они абсолютно необходимы. Тот факт, что вы находитесь в памяти, не обязательно означает, что процессор не спит, чтобы выводить звук, отправлять широковещательные сообщения другим компонентам или вообще что-либо делать. - person ianhanniballake; 01.11.2018
comment
setWakeMode — это интересно. Он действительно получает WakeLock, но также использует его, чтобы экран оставался включенным. Я сделал небольшое приложение для тестирования MediaPlayer специально без каких-либо WakeLocks и протестировал его на дорогих и недорогих телефонах под управлением Android 4.4, 8.0 и 9.0. После 30 часов непрерывного использования он никогда не заикается, не останавливается и не останавливается. Аналогично, я могу создать службу переднего плана с бесконечным циклом вывода в logcat - он всегда работает (пока служба не будет убита и перезапущена, после чего она снова начнет вывод). Поэтому я должен спросить еще раз, что точно подразумевается под поддержанием бодрствования процессора? Каков вариант использования? - person user1202032; 04.11.2018
comment
Попробуйте следующее: используйте Handler.postDelayed(), чтобы публиковать сообщение журнала каждые 60 секунд. Выключите экран и посмотрите, продолжает ли он регистрироваться каждые 60 секунд. Теперь попробуйте то же самое с будильником RTC (не RTC_WAKEUP). Проблема в том, что процессору нечего делать и он переходит в спящий режим. Отсутствие wakelock означает, что он может спать в течение довольно долгого времени, даже если вы поставили в очередь работу. - person ianhanniballake; 04.11.2018