Когда пользователь оставляет свое устройство под управлением Android бездействующим, оно быстро переходит в состояние ожидания, чтобы избежать разрядки аккумулятора. Однако бывают случаи, когда приложению необходимо предотвратить переход процессора в состояние ожидания. В некоторых случаях приложению может потребоваться оставить экран включенным во время работы. В других случаях приложению не нужно держать экран включенным, но процессор все равно должен быть активным.
Выбор подхода зависит от потребностей вашего приложения. Однако общее правило заключается в том, что вам следует использовать максимально упрощенный подход, чтобы минимизировать влияние вашего приложения на системные ресурсы. Этот документ поможет вам выбрать правильную технологию Android для вашей ситуации.
Выбирайте правильную технологию
Лучший вариант сохранения режима сна вашего устройства зависит от потребностей вашего приложения. Этот раздел поможет вам выбрать правильный подход.
- Нужно ли вашему приложению держать экран включенным?
- Если да , см. раздел Не отключать экран . Может существовать специальный API, который делает то, что вам нужно; например, если вы реализуете пользовательский интерфейс для телефонных звонков, вы можете использовать телекоммуникационную платформу Android , которая сохраняет экран включенным, когда это необходимо. Если для вашей ситуации нет специального API-интерфейса, вы можете использовать API
keepScreenOn
.
- Если да , см. раздел Не отключать экран . Может существовать специальный API, который делает то, что вам нужно; например, если вы реализуете пользовательский интерфейс для телефонных звонков, вы можете использовать телекоммуникационную платформу Android , которая сохраняет экран включенным, когда это необходимо. Если для вашей ситуации нет специального API-интерфейса, вы можете использовать API
- В вашем приложении работает служба переднего плана, и вам нужно, чтобы устройство не спало, когда экран выключен во время работы службы?
- Если «Нет» , вам не нужно держать устройство в активном режиме. Если пользователь активно взаимодействует с приложением, устройство не будет спать. Если пользователь не взаимодействует с вашим приложением и вы не запускаете службу приоритетного плана, при необходимости следует перевести устройство в режим ожидания. Если вам просто нужно убедиться, что какая-то работа выполняется, пока пользователь находится вне приложения, см. документацию по фоновым задачам , чтобы найти лучший вариант.
- Если да , сначала подтвердите, что вам действительно нужно использовать службу переднего плана. В зависимости от вашей ситуации может существовать какой-то специальный API, который вы можете использовать для удовлетворения своих потребностей вместо службы переднего плана. Информацию об этом можно найти в документации Foreground Service . Например, если вам нужно отслеживать местоположение пользователя, вы можете использовать API геозон вместо службы переднего плана определения
location
.
- Будет ли это вредно для работы пользователя, если устройство приостанавливается во время работы службы переднего плана и экран устройства выключен? (Например, если вы используете службу переднего плана для обновления уведомлений, приостановка работы устройства не будет плохой работой пользователя.)
- Если Нет , не используйте Wakelock. Действие возобновляется автоматически, как только пользователь взаимодействует со своим устройством, что выводит его из режима ожидания.
- Если да , возможно, вам придется использовать блокировку пробуждения . Тем не менее, вам все равно следует проверить, используете ли вы уже API или выполняете ли действие, которое объявляет блокировку пробуждения от вашего имени, как описано в разделе Действия, поддерживающие работу устройства .
Действия, которые не дают устройству спать
Если ваше приложение выполняет любое из следующих действий, вам не нужно самостоятельно устанавливать блокировку пробуждения. Следующие действия и API не дают устройству спать.
- Если вы воспроизводите аудио, аудиосистема устанавливает и управляет блокировкой пробуждения за вас; вам не нужно делать это самостоятельно.
- Если вы используете API или библиотеки планирования задач, такие как WorkManager ,
JobScheduler
илиDownloadManager
, система или библиотека получает блокировку пробуждения от вашего имени. - Если вы используете Media3 ExoPlayer , вы можете использовать
ExoPlayer.setWakeMode()
чтобы проигрыватель установил для вас блокировку пробуждения. - Некоторые датчики устройства являются датчиками пробуждения; вы можете использовать
SensorManager
, чтобы эти датчики выводили устройство из спящего режима, когда у них есть данные для отчета. Чтобы проверить, является ли датчик датчиком пробуждения, вызовитеSensor.isWakeUpSensor
.
См. также
,Когда пользователь оставляет свое устройство под управлением Android бездействующим, оно быстро переходит в состояние ожидания, чтобы избежать разрядки аккумулятора. Однако бывают случаи, когда приложению необходимо предотвратить переход процессора в состояние ожидания. В некоторых случаях приложению может потребоваться оставить экран включенным во время работы. В других случаях приложению не нужно держать экран включенным, но процессор все равно должен быть активным.
Выбор подхода зависит от потребностей вашего приложения. Однако общее правило заключается в том, что вам следует использовать максимально упрощенный подход, чтобы минимизировать влияние вашего приложения на системные ресурсы. Этот документ поможет вам выбрать правильную технологию Android для вашей ситуации.
Выбирайте правильную технологию
Лучший вариант сохранения режима сна вашего устройства зависит от потребностей вашего приложения. Этот раздел поможет вам выбрать правильный подход.
- Нужно ли вашему приложению держать экран включенным?
- Если да , см. раздел Не отключать экран . Может существовать специальный API, который делает то, что вам нужно; например, если вы реализуете пользовательский интерфейс для телефонных звонков, вы можете использовать телекоммуникационную платформу Android , которая сохраняет экран включенным, когда это необходимо. Если для вашей ситуации нет специального API-интерфейса, вы можете использовать API
keepScreenOn
.
- Если да , см. раздел Не отключать экран . Может существовать специальный API, который делает то, что вам нужно; например, если вы реализуете пользовательский интерфейс для телефонных звонков, вы можете использовать телекоммуникационную платформу Android , которая сохраняет экран включенным, когда это необходимо. Если для вашей ситуации нет специального API-интерфейса, вы можете использовать API
- В вашем приложении работает служба переднего плана, и вам нужно, чтобы устройство не спало, когда экран выключен, пока служба работает?
- Если «Нет» , вам не нужно держать устройство в активном режиме. Если пользователь активно взаимодействует с приложением, устройство не будет спать. Если пользователь не взаимодействует с вашим приложением и вы не запускаете службу приоритетного плана, при необходимости следует перевести устройство в режим ожидания. Если вам просто нужно убедиться, что какая-то работа выполняется, пока пользователь находится вне приложения, см. документацию по фоновым задачам , чтобы найти лучший вариант.
- Если да , сначала подтвердите, что вам действительно нужно использовать службу переднего плана. В зависимости от вашей ситуации может существовать какой-то специальный API, который вы можете использовать для удовлетворения своих потребностей вместо службы переднего плана. Информацию об этом можно найти в документации Foreground Service . Например, если вам нужно отслеживать местоположение пользователя, вы можете использовать API геозон вместо службы переднего плана определения
location
.
- Будет ли это вредно для работы пользователя, если устройство приостанавливается во время работы службы переднего плана и экран устройства выключен? (Например, если вы используете службу переднего плана для обновления уведомлений, приостановка работы устройства не будет плохой работой пользователя.)
- Если Нет , не используйте Wakelock. Действие возобновляется автоматически, как только пользователь взаимодействует со своим устройством, что выводит его из режима ожидания.
- Если да , возможно, вам придется использовать блокировку пробуждения . Тем не менее, вам все равно следует проверить, используете ли вы уже API или выполняете ли действие, которое объявляет блокировку пробуждения от вашего имени, как описано в разделе Действия, которые поддерживают устройство в активном состоянии .
Действия, которые не дают устройству спать
Если ваше приложение выполняет любое из следующих действий, вам не нужно самостоятельно устанавливать блокировку пробуждения. Следующие действия и API не позволяют устройству бодрствовать.
- Если вы воспроизводите аудио, аудиосистема устанавливает и управляет блокировкой пробуждения за вас; вам не нужно делать это самостоятельно.
- Если вы используете API или библиотеки планирования задач, такие как WorkManager ,
JobScheduler
илиDownloadManager
, система или библиотека получает блокировку пробуждения от вашего имени. - Если вы используете Media3 ExoPlayer , вы можете использовать
ExoPlayer.setWakeMode()
чтобы проигрыватель установил для вас блокировку пробуждения. - Некоторые датчики устройства являются датчиками пробуждения; вы можете использовать
SensorManager
, чтобы эти датчики выводили устройство из спящего режима, когда у них есть данные для отчета. Чтобы проверить, является ли датчик датчиком пробуждения, вызовитеSensor.isWakeUpSensor
.