Чтобы избежать разрядки аккумулятора, Android-устройство, оставленное бездействующим, быстро засыпает. Однако бывают случаи, когда приложению необходимо «разбудить» экран или процессор и оставить его активным для выполнения некоторой работы.
Выбор подхода зависит от потребностей вашего приложения. Однако общее практическое правило заключается в том, что вам следует использовать максимально упрощенный подход для вашего приложения, чтобы минимизировать влияние вашего приложения на системные ресурсы. В следующих разделах описывается, как действовать в случаях, когда режим сна устройства по умолчанию несовместим с требованиями вашего приложения.
Альтернативы использованию блокировки пробуждения
Прежде чем добавлять поддержку Wakelock в свое приложение, подумайте, поддерживают ли варианты использования вашего приложения одно из следующих альтернативных решений:
Если ваше приложение выполняет длительную загрузку HTTP, рассмотрите возможность использования
DownloadManager
.Если ваше приложение синхронизирует данные с внешнего сервера, рассмотрите возможность создания адаптера синхронизации .
Если ваше приложение использует фоновые службы, рассмотрите возможность использования JobScheduler или Firebase Cloud Messaging для запуска этих служб через определенные промежутки времени.
Если вам необходимо, чтобы приложение-компаньон работало всякий раз, когда сопутствующее устройство находится в пределах досягаемости, используйте диспетчер устройств-компаньонов .
Держите экран включенным
Некоторым приложениям, например играм или фильмам, экран должен оставаться включенным. Лучший способ сделать это — использовать FLAG_KEEP_SCREEN_ON
в своем действии (и только в действии, а не в службе или другом компоненте приложения). Например:
Котлин
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
Ява
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
Преимущество этого подхода заключается в том, что в отличие от блокировок пробуждения (обсуждаемых в разделе «Поддержание ЦП включенным ») он не требует специального разрешения, и платформа правильно управляет перемещением пользователя между приложениями, и вашему приложению не нужно беспокоиться об освобождении неиспользуемых ресурсов.
Другой способ реализовать это — использовать XML-файл макета вашего приложения с помощью атрибута android:keepScreenOn
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
Использование android:keepScreenOn="true"
эквивалентно использованию FLAG_KEEP_SCREEN_ON
. Вы можете использовать любой подход, который лучше всего подходит для вашего приложения. Преимущество программной установки флага в вашей деятельности заключается в том, что он дает вам возможность позже программно очистить флаг и тем самым позволить экрану выключиться.
Режим Ambient для телевизора
На телевизоре следует использовать FLAG_KEEP_SCREEN_ON
, чтобы предотвратить переход устройства в Ambient Mode во время активного воспроизведения видео. Если FLAG_KEEP_SCREEN_ON
не установлен в результате активности на переднем плане, устройство автоматически перейдет в Ambient Mode после периода бездействия.
Держите процессор включенным
Если вам нужно, чтобы процессор работал, чтобы завершить некоторую работу до того, как устройство перейдет в спящий режим, вы можете использовать функцию системной службы PowerManager
, называемую блокировкой пробуждения. Блокировки пробуждения позволяют вашему приложению контролировать состояние питания хост-устройства.
Создание и удержание блокировки пробуждения может существенно повлиять на срок службы батареи хост-устройства. Таким образом, вам следует использовать блокировки пробуждения только в случае крайней необходимости и удерживать их как можно более короткое время. Например, вам никогда не понадобится использовать блокировку пробуждения в действии. Как описано выше, если вы хотите, чтобы экран был включен в вашей деятельности, используйте FLAG_KEEP_SCREEN_ON
.
Одним из законных случаев использования блокировки пробуждения может быть фоновая служба, которой необходимо захватить блокировку пробуждения, чтобы ЦП продолжал работать, пока экран выключен. Опять же, эту практику следует свести к минимуму из-за ее влияния на срок службы батареи.
Чтобы использовать блокировку пробуждения, первым делом нужно добавить разрешение WAKE_LOCK
в файл манифеста вашего приложения:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Если ваше приложение включает в себя приемник широковещательного вещания, который использует службу для выполнения некоторой работы, вот как вы можете напрямую установить блокировку пробуждения:
Котлин
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
Ява
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
Чтобы снять блокировку пробуждения, вызовите wakelock.release()
. Это освобождает ваши права на процессор. Важно снимать блокировку пробуждения сразу после завершения ее использования приложением, чтобы не разрядить батарею.