• Почему андроид не переходит в спящий режим. Как отключить засыпание экрана в приложениях на Android. Режимы энергосбережения Android

    На всех смартфонах и планшетах под управлением Android задано время, через которое аппарат переходит в спящий режим. Большинство устройств «засыпают» спустя 30 секунд бездействия пользователя. Это время установлено по умолчанию, но не всем его хватает для чтения и просмотра контента. Увеличить его можно в настройках, а чтобы полностью отключить тайм-аут экрана, придется активировать опцию в разделе «Для разработчиков» либо воспользоваться специальным приложением.

    Такое короткое время до затухания экрана выставлено по двум причинам. Во-первых, по соображениям безопасности – чтобы никто без ведома владельца не успел воспользоваться устройством, если тот его не заблокировал. А вторая причина кроется в экономии заряда аккумулятора.

    Дело в том, что подсветка дисплея разряжает батарею смартфона, поэтому существенное увеличение времени, по прошествии которого экран будет гаснуть, уменьшит время работы устройства от одного заряда. Здесь стоит найти «золотую середину» – настроить тайм-аут так, чтобы вам было комфортно пользоваться телефоном, при этом, чтобы аппарат не работал впустую пол часа, если вы забудете нажать кнопку блокировки.

    Поэтому лучше всего отключить «засыпание» дисплея только в нужных программах, а для всей системы выставить значение тайм-аута в пределах одной-двух минут. Как это сделать, рассказано дальше в статье.

    Другие инструкции по теме:

    Настройка спящего режима на Android

    На любом Android-смартфоне тайм-аут экрана можно отрегулировать в настройках. Для этого перейдите в раздел «Экран», на новых версиях Android нажмите «Дополнительно» и откройте «Спящий режим».

    В MIUI на Xiaomi пункт «Спящий режим» расположен в разделе «Блокировка и защита».

    Теперь выберите продолжительность времени бездействия, по прошествии которого устройство будет блокироваться.

    На стоковом Android нельзя полностью отключить тайм-аут (максимальное значение, которое можно установить – 30 минут). Зато такая опция присутствует в прошивках, например: в MIUI на смартфонах Xiaomi и в EMUI на телефонах Huawei и Honor.

    Но в разделе и на стоковом Android, и в прошивках есть пункт «Не выключать экран». Если его активировать, устройство не будет уходить в спящий режим во время подзарядки.

    Как отключить «засыпание» экрана в приложениях с помощью программы Stay Alive!

    Сторонними разработчиками созданы десятки специальных программ, которые позволяют отключить тайм-аут во время зарядки, для всей системы или для отдельных приложений. В последнем случае дисплей не будет гаснуть, когда запущены либо работают в фоне приложения, которые выбрал пользователь.

    Одной из лучших программ в своем роде является Stay Alive! . При этом все нужные функции доступны в ее бесплатной версии – ей и воспользуемся. На новых версиях Android 5 после установки приложения придется разрешить доступ к истории использования. При первом запуске программы всплывет окно с предупреждением – нажав кнопку «ОК», вы перейдете в раздел «Доступ к данным», а уже там сможете выбрать Stay Alive! и предоставить доступ к истории использования.

    Если вы проигнорировали сообщение, появившееся при первом запуске Stay Alive!, перейти к разделу «Доступ к данным» можно следующим образом: зайдите в «Настройки» → «Приложения и уведомления», если потребуется, нажмите «Дополнительно», и выберите «Специальный доступ». Там и находится пункт «Доступ к данным».

    В MIUI пункт называется «Приложения с доступом к данным» и он расположен в разделе «Администрирование устройства» по пути: «Настройки» → «Расширенные настройки» → «Конфиденциальность».

    На смартфонах Huawei и Honor, чтобы разрешить программе Stay Alive! отслеживать, какие приложения вы используете, откройте меню настроек и перейдите в раздел «Безопасность и конфиденциальность» → «Дополнительные настройки» → «Доступ к статистике использования». Выберите Stay Alive! и активируйте тумблер «Отслеживать использование».

    После первого запуска приложения и предоставления ему необходимого разрешения, Stay Alive! начнет работать, а смартфон перестанет уходить в спящий режим. По умолчанию будет активирован пункт «Keep screen on while charging and battery», а тайм-аут будет полностью отключен. Чтобы экран не гас только во время зарядки, выберите «Keep screen on while charging», а если хотите приостановить работу программы, нажмите на «Pause Stay Alive!».

    Также с помощью приложения Stay Alive! можно отключить блокировку устройства, когда запущены либо работают в фоне определенные приложения. Для этого активируйте функцию «Enable selected apps» и выберите вариант «Keep screen on ONLY for selected apps». Затем откройте пункт «Select apps that will Stay Alive!» и отметьте нужные программы. Чтобы было проще искать приложения, можете использовать поиск.

    Для того, чтобы устройство не «засыпало» во время работы выбранных приложений, также должен быть активирован один из двух режимов: «Keep screen on while charging» или «Keep screen on while charging and battery». Если выбран «Pause Stay Alive!», программа работать не будет.

    Чтобы отключить тайм-аут для всей системы, кроме определенных приложений, выберите «Keep screen on EXCEPT for selected apps», откройте список программ (нажмите «Select apps that will Stay Alive!») и отметьте нужные.

    Для того, чтобы уменьшить расход заряда аккумулятора, когда спящий режим отключен, разработчик Stay Alive! добавил функцию «Allow the screen to dim». Если ее активировать, экран будет затемняться, но не гаснуть.

    Honor 6 оснащается несъёмным литиево-полимерным аккумулятором ёмкостью 3100 мА-ч (11.5 Вт-ч). Ёмкость аккумулятора не рекордная, но очень хорошая и достаточная для обеспечения длительного времени автономной работы.

    В программном обеспечении Honor 6 присутствует большое количество настроек энергопотребления. В меню «Энергосбережение» можно выбрать один из трёх профилей энергопотребления - «Производительность», «Умный» и «Энергосберегающий». При этом смартфон прогнозирует оставшееся время работы в каждом из режимов.

    Энергосберегающий режим в Honor 6 реализован очень интересно. В нём блокируются практически все функции телефона, кроме звонков, SMS и доступа к контактам. Зато в этом режиме смартфон работает очень долго. Это хорошее решение для тех моментов, когда аккумулятор почти разряжен, а вам обязательно надо оставаться на связи. При этом при падении заряда аккумулятора до критично низкого уровня смартфон сам предложит вам перейти в режим энергосбережения, порог срабатывания этого предупреждения пользователь может выбрать сам (8, 20 или 30 процентов).

    За счёт агрессивных настроек встроенный менеджер питания зачастую закрывает приложения, работающие в фоновом режиме. В том числе «под раздачу» могут попасть и приложения для обмена сообщениями (например, Viber). Но пользователь может вручную указать, какие приложения должны быть защищены от закрытия в спящем режиме. Например, я на своём Honor 6 включил эту опцию для Viber.

    Наконец, в меню есть специальный режим, который в русской версии интерфейса почему-то называется «Заставка» (в украинской - «Економний режим роботи»). В этом режиме смартфон отрисовывает и выводит на экран графику в разрешении 1280х720, результатом чего становится повышение быстродействия и снижение энергопотребления. Правда, при этом несколько страдает чёткость мелких шрифтов.

    В сбалансированном режиме энергопотребления Honor 6 способен продержаться порядка двух дней при трёх часах работы экрана в день. Это очень достойный результат. Если играть на смартфоне в игры, то время работы ожидаемо сокращается, но и в этом случае аппарат без проблем доживает до вечера.

    Переводим... Перевести Китайский (упрощенное письмо) Китайский (традиционное письмо) Английский Французский Немецкий Итальянский Португальский Русский Испанский Турецкий

    К сожалению, мы не можем перевести эту информацию прямо сейчас - пожалуйста, повторите попытку позже.

    Christopher Bird

    Управление питанием в операционной системе Android - блокировка сна

    Наверное, многие сталкивались с ситуацией, когда мобильное устройство не может отработать на одной зарядке аккумулятора в течение полного дня. Каждый понимает всю неприятность ситуации, когда к концу рабочего дня телефон превращается в бесполезный кирпич. Современные приложения дают возможность выполнять на смартфонах задачи, для которых раньше требовался компьютер. Но если сравнивать смартфоны с PC, то из-за существенно меньшего размера, они отличаются и существенно меньшей емкостью аккумуляторов. Таким образом, телефон должен обладать, по сути, функциональностью ноутбука, но при этом - и это очень строгое требование - должен работать от аккумулятора без подзарядки в течение достаточно долгого времени.

    В Android и в других мобильных ОС удалось добиться длительной работы от аккумулятора за счет использования агрессивной модели управления питанием. Через некоторое время после использования телефона его экран отключается, а CPU переходит в режим пониженного потребления электроэнергии. Таким образом, когда телефон не используется, энергия расходуется совсем понемногу. Благодаря такому подходу, телефоны в режиме ожидания могут работать без подзарядки в течение нескольких дней. Диспетчер электропитания Android построен на следующем, вполне логичном принципе: при отключении экрана отключается и CPU.

    Но разработчики Android предусмотрели возможность не давать устройствам с этой ОС переходить в спящий режим. В некоторых случаях может потребоваться, чтобы CPU оставался в активном состоянии даже при выключенном экране, или же может понадобиться запретить автоматическое отключение экрана при выполнении определенных задач. Для этой цели разработчики Google* включили так называемые блокировки сна в API PowerManager. Приложения, которым нужно избежать «засыпания» устройства, могут воспользоваться такой блокировкой. Пока в системе есть активная блокировка сна, устройство не сможет «заснуть», то есть перейти в режим ожидания (до снятия блокировки). При использовании блокировок сна важно понимать, что необходимо правильно снимать эти блокировки, когда они не нужны. Иначе аккумулятор устройства быстро сядет: ведь устройство не сможет вернуться в состояние пониженного расхода электроэнергии.

    В этой статье описываются некоторые приложения Android, использующие блокировки сна в Android 4.0. В статье также описано приложение «Wakelocks» из набора SDPSamples для демонстрации реализации блокировок сна в коде.

    Использование блокировок сна приложениями

    В системе Android можно увидеть, какие службы удерживают блокировки сна и не дают системе перейти в один из режимов экономии электроэнергии. Файл file /proc/wakelocks на устройстве содержит список служб и драйверов, использующих блокировки сна. Отслеживая содержимое файла /sys/power/wake_lock (требуется доступ с правами root), можно узнать, есть ли блокировка ресурсов CPU, и какая служба удерживает блокировку wakelock2. Мне удалось зафиксировать несколько случаев использования блокировок на моем смартфоне Galaxy Nexus под управлением Android 4.0:

    Таблица: Использование блокировок сна стандартными приложениями Android

    Приложения YouTube и Музыка являются хорошими примерами использования блокировок сна на различных уровнях. Приложение YouTube захватывает блокировку сна, когда пользователь просматривает потоковое видео. В течение всего воспроизведения видео экран остается включенным (невзирая на установленные в системе параметры экрана). Но если во время воспроизведения пользователь нажмет кнопку питания, то устройство перейдет в режим сна: экран будет отключен, а воспроизведение звука и видео прекратится. Приложение «Музыка» использует другую блокировку сна при воспроизведении аудио. Параметры экрана не изменяются, поэтому экран устройства отключится согласно настроенным параметрам. Но даже при отключенном экране блокировка сна не даст отключиться CPU, чтобы воспроизведение музыки продолжалось, даже если пользователь нажмет кнопку питания.

    Выбор типа блокировки

    Перед тем, как начать написание кода блокировок сна, нужно понять, какие существуют типы блокировок сна, чтобы выбрать наиболее подходящий тип для использования в приложении. В API Android PowerManager описываются различные доступные флаги блокировок, изменяющие состояние электропитания устройства:

    Значение флага CPU Экран Подсветка клавиатуры
    PARTIAL_WAKE_LOCK Вкл Выкл Выкл
    SCREEN_DIM_WAKE_LOCK Вкл Затемнен Выкл
    SCREEN_BRIGHT_WAKE_LOCK Вкл Полная яркость Выкл
    FULL_WAKE_LOCK Вкл Полная яркость Полная яркость

    Таблица: Из API Android PowerManager.

    Обратите внимание, что блокировки сна существенно сокращают время работы устройств с Android от аккумуляторов, поэтому блокировки сна не следует использовать, если можно обойтись без них. При возможности, их следует снимать как можно скорее.

    Приложение, использующее блокировку сна, должно запросить особое разрешение для этого. Для этого применяется разрешение android.permission.WAKE_LOCK в файле манифеста приложения. Это означает, что даже при установке пользователем приложения с блокировками сна с помощью Google Play, пользователи получат предупреждение о том, что данное приложение содержит компоненты, которые могут не дать телефону «заснуть». Если требуется запретить затемнение экрана при определенном действии приложения, это можно сделать и способом, для которого не нужно особое разрешение. В WindowManager есть переменная FLAG_KEEP_SCREEN_ON, которую можно задать, если методу View приложения нужно оставить экран во включенном состоянии. Для управления экраном рекомендуется использовать именно такой подход, поскольку его воздействие происходит только внутри приложения. При переключении пользователя к другому приложению WindowManager снимает блокировку сна.

    Удержание экрана во включенном состоянии (из набора SDPSamples)

    Приложение WakeLock из набора SDPSamples демонстрирует, что приложение может удерживать экран во включенном состоянии с помощью Window Manager, без написания кода блокировки сна. Запустите приложение WakeLock и выберите элемент списка "Win Man Screen On".

    Пока в строке состояния кнопки будет текст «Screen is LOCKED», экран будет включен. Если же в строке состояния кнопки будет текст «Screen is UNLOCKED», то через 5 секунд бездействия экран отключится.

    В коде это осуществляется функцией screenLockUpdateState() в файле WakeLockActivity.java путем установки и снятия FLAG_KEEP_SCREEN_ON для текущего окна при каждом нажатии кнопки и изменении состояния.

    Public void screenLockUpdateState() { if (mIsDisplayLocked) { ... // update display state getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { ... // update display state getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }

    Реализация блокировки сна

    В приложение WakeLock из набора SDPSamples реализованы блокировки сна различных типов. После запуска приложения WakeLock выбираем один из 4 типов блокировок сна: Power Wake Lock Full, Power Wake Lock Bright, Power Wake Lock Dim и Power Wake Lock Partial. Эти 4 варианта соответствуют 4 флагам блокировок сна, описанным в API PowerManager. Каждый элемент демонстрирует реакцию устройства на попытку отключить экран через 5 секунд.

    Отслеживая содержимое файла /sys/power/wake_lock (требуется доступ с правами root), можно увидеть, что после нажатия кнопки питания сохраняется только блокировка сна PARTIAL_WAKE_LOCK . Остальные блокировки сна не дают полностью отключить экран: он продолжает работать с тем или иным уровне яркости.

    При написании кода блокировок сна нужно прежде всего запросить разрешение на их использование в манифесте AndroidManifest.xml:

    После этого можно создать объект WakeLock, содержащий функции acquire() и release() для управления блокировкой сна. Хороший пример находится в файле WakeLockActivity.java:

    Public void onCreate(Bundle savedInstanceState) { ... mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); ... mWakeLock = mPowerManager.newWakeLock(mWakeLockState, "UMSE PowerTest"); if (mWakeLock != null) { mWakeLock.acquire(); ... } } protected void onDestroy() { if (mWakeLock != null) { mWakeLock.release(); mWakeLock = null; } ... }

    Заключение

    Блокировка сна - это возможность системы Android, позволяющая разработчикам изменять состояние электропитания устройства по умолчанию. Опасность использования блокировок сна в приложениях заключается в преждевременном израсходовании заряда аккумуляторов. Некоторые явные преимущества блокировок сна очевидны в ряде стандартных приложений Google, например, для навигации или для воспроизведения музыки и видео. Каждый разработчик приложений должен самостоятельно принимать решение о том, будет ли применение блокировок сна целесообразным.

    Об авторе

    Кристофер Берд (Christopher Bird) начал свою карьеру в подразделении Intel SSG в 2007 году и участвует в построении экосистемы устройств с процессорами Atom (телефонов и планшетов)

    Справочные материалы

    2 LWN – “Wakelocks and the embedded problem”: http://lwn.net/Articles/318611/

    Примечания

    ИНФОРМАЦИЯ В ДАННОМ ДОКУМЕНТЕ ПРИВЕДЕНА ТОЛЬКО В ОТНОШЕНИИ ПРОДУКТОВ INTEL. ДАННЫЙ ДОКУМЕНТ НЕ ПРЕДОСТАВЛЯЕТ ЯВНОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ЛИЦЕНЗИИ, ЛИШЕНИЯ ПРАВА ВОЗРАЖЕНИЯ ИЛИ ИНЫХ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ. КРОМЕ СЛУЧАЕВ, УКАЗАННЫХ В УСЛОВИЯХ И ПРАВИЛАХ ПРОДАЖИ ТАКИХ ПРОДУКТОВ, INTEL НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ И ОТКАЗЫВАЕТСЯ ОТ ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ В ОТНОШЕНИИ ПРОДАЖИ И/ИЛИ ИСПОЛЬЗОВАНИЯ СВОИХ ПРОДУКТОВ, ВКЛЮЧАЯ ОТВЕТСТВЕННОСТЬ ИЛИ ГАРАНТИИ ОТНОСИТЕЛЬНО ИХ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ОБЕСПЕЧЕНИЯ ПРИБЫЛИ ИЛИ НАРУШЕНИЯ КАКИХ-ЛИБО ПАТЕНТОВ, АВТОРСКИХ ПРАВ ИЛИ ИНЫХ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ.

    КРОМЕ СЛУЧАЕВ, СОГЛАСОВАННЫХ INTEL В ПИСЬМЕННОЙ ФОРМЕ, ПРОДУКТЫ INTEL НЕ ПРЕДНАЗНАЧЕНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ В СИТУАЦИЯХ, КОГДА ИХ НЕИСПРАВНОСТЬ МОЖЕТ ПРИВЕСТИ К ТРАВМАМ ИЛИ ЛЕТАЛЬНОМУ ИСХОДУ.

    Корпорация Intel оставляет за собой право вносить изменения в технические характеристики и описания своих продуктов без предварительного уведомления. Проектировщики не должны полагаться на отсутствующие характеристики, а также характеристики с пометками «зарезервировано» или «не определено». Эти характеристики резервируются Intel для будущего использования, поэтому отсутствие конфликтов совместимости для них не гарантируется. Информация в данном документе может быть изменена без предварительного уведомления. Не используйте эту информацию в окончательном варианте дизайна.

    Продукты, описанные в данном документе, могут содержать ошибки и неточности, из-за чего реальные характеристики продуктов могут отличаться от приведенных здесь. Уже выявленные ошибки могут быть предоставлены по запросу. Перед размещением заказа получите последние версии спецификаций в региональном офисе продаж Intel или у местного дистрибьютора.

    Номерные копии документов, на которые имеются ссылки в данном документе, а также другие материалы Intel можно заказать по телефону 1-800-548-4725 или загрузить по адресу http://www.intel.com/design/literature.htm

    Программное обеспечение и нагрузки, использованные в тестах производительности, могли быть оптимизированы для достижения высокой производительности на микропроцессорах Intel. Тесты производительности, такие как SYSmark и MobileMark, проводятся на определенных компьютерных системах, компонентах, программах, операциях и функциях. Любые изменения любого из этих элементов может привести к изменению результатов. При выборе приобретаемых продуктов следует обращаться к другой информации и тестам производительности, в том числе к тестам производительности определенного продукта в сочетании с другими продуктами.

    Данный документ и описываемое в нем программное обеспечение предоставляются по лицензии и могут использоваться и распространяться только согласно условиям лицензии.

    Intel® и эмблема Intel являются товарными знаками корпорации Intel в США и в других странах.

    © Intel Corporation, 2012. Все права защищены.

    *Другие наименования и торговые марки могут быть собственностью третьих лиц.

    Переход мобильного устройства в спящий режим означает автоматическое отключение дисплея, когда гаджет определенное время находится в бездействии. Эта возможность реализована с целью экономии энергии аккумулятора телефона.

    Чтобы включить или отключить спящий режим в Android, необходимо перейти в соответствующие настройки. В зависимости от модели смартфона они несколько отличаются, хотя и незначительно.

    Как это сделать

    Когда возникает необходимость включить/отключить спящий режим в Android, нужно перейти в основное меню настроек телефона и найти опцию «Дисплей» или «Экран». При нажатии на эту ссылку появится вкладка «Спящий режим». Здесь устанавливается временной интервал, по истечению которого устройство автоматически перейдет в спящий режим в Android. Установив галочку «Никогда», вы отключаете возможность работы устройства в спящем режиме, поэтому оно будет активно функционировать все время, пока телефоном никто не пользуется.

    Возможные проблемы

    Иногда возникают ситуации, когда необходимо выключить дисплей мобильного устройства, не активируя спящий режим. Стандартный вариант – экономия батареи смартфона, когда он подключен к телевизору при помощи HDMI-кабеля.

    Основная проблема состоит в том, что если выключить смартфон, то энергия не будет идти по HDMI кабелю, в результате чего последует затухание экрана телевизора, так как телефон находится в спящем режиме. Приведем еще 1 пример – на планшете запущена . Затем к устройству подключается клавиатура или мышь с помощью док-станции. Изображение выводится на экран. Повторяется упомянутая проблема. Нельзя выключить экран телефона без перехода в спящий режим. Если ничего не делать, то смартфон быстро разрядится. Стандартными настройками решить задачу невозможно.

    Решение

    Необходимо скачать под названием Screen Standby. Средствами программы можно отключить дисплей при полной работоспособности телефона. Загрузить приложение можно через сервис Google Play на бесплатной основе.

    Отныне просматривать фильмы, запускать игровые приложения и работать в интернете можно на большом экране, подключив телефон к телевизору. Существенно экономится заряд. Хотим заметить, что на текущий момент не существует достойных аналогов этому программному обеспечению. Чтобы утилита корректно функционировала, следует установить root права доступа. С помощью Screen Standby можно выключать подсветку в автоматическом режиме в момент подключения HDMI-кабеля, а также перевести дисплей телефона в тачпад-режим.

    Давным-давно, когда Android еще не был мейнстримом, любой разработчик мог написать приложение, которое сможет спокойно висеть в фоне и в режиме реального времени обмениваться данными с сервером. Но чем дальше, тем более жесткие техники сохранения энергии применяет Google, и сегодня так просто сетевое реалтаймовое приложение уже не реализуешь. Однако есть несколько трюков, которые позволяют это сделать.

    Давай представим, что у нас есть приложение, а у него, в свою очередь, есть служба (service), которая должна постоянно висеть в фоне, обрабатывать команды, полученные от сетевого сервера, и отправлять ответы. Связь с сервером, как это и положено мобильным устройствам, поддерживается с помощью long poll запросов, то есть приложение подключается к удаленному серверу и ждет, пока тот отправит что-либо в ответ, а потом переподключается и ждет снова. Это эффективный и очень экономный в плане заряда батареи способ, который в том числе используется в механизме push-уведомлений самого Android.

    В теории все выглядит отлично, архитектура приложения абсолютно правильная, вот только, если начать его тестировать, вскроется несколько очень неприятных моментов.

    Режимы энергосбережения Android

    В Android 4.4–5.1 (версии ниже мы рассматривать не будем - они стремительно устаревают) служба будет работать и моментально откликаться на запросы сервера, но только до тех пор, пока экран включен. Через несколько секунд после отключения экрана смартфон перейдет в режим сна (suspend), и промежуток между отправкой запроса и ответом нашего приложения будет составлять примерно минуту. Это срок между maintenance-пробуждениями устройства, и повлиять на него мы не можем.

    В Android 6.0–7.1 ситуация будет примерно такой же, однако спустя примерно час смартфон перейдет в так называемый . После этого ответ от приложения можно либо не получить вовсе, либо получить спустя час или два. А все потому, что в режиме Doze смартфон фактически не дает работать сторонним приложениям и их службам и полностью отрезает им доступ в Сеть. Управление они могут получить только на короткий промежуток времени спустя час после перехода в режим Doze, затем два часа, четыре часа, со все большим увеличением промежутков между пробуждениями.

    Хорошие новости в том, что Doze работает общесистемно и включается спустя час после отключения экрана и только если не трогать смартфон (в 7.0–7.1 можно и трогать), а отключается сразу после разблокировки смартфона, подсоединения к заряднику или движения смартфона (опять же не в 7.0–7.1). То есть можно надеяться на то, что хотя бы днем наш сервис будет работать нормально.

    Плохие же новости в том, что, помимо Doze, в Android 6.0–7.1 есть и другой механизм энергосбережения под названием App Standby. Работает он примерно так: система следит за тем, какие приложения использует юзер, и применяет к редко используемым приложениям те же ограничения, что и в случае с режимом Doze. При подключении к заряднику все переведенные в режим Standby приложения получают амнистию. К приложениям, имеющим уведомление или права администратора (не root), режим Standby не применяется.

    Итого, в Android есть сразу три механизма, с которыми придется бороться:

    • Suspend - обычный режим энергосбережения, может замедлить получение ответа от устройства примерно на одну минуту;
    • App Standby - агрессивный режим энергосбережения, способный замедлить получение ответа на сутки;
    • Doze - агрессивный общесистемный режим энергосбережения, который применяется ко всем приложениям.

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

    Сценарий 1. Небольшая задержка в ответе некритична, переход в Doze некритичен

    В этом сценарии у тебя есть приложение, для которого задержка в ответе до одной минуты некритична, а переход смартфона в режим агрессивного энергосбережения совсем не страшен. Все, что тебе нужно, - это чтобы система не отправляла приложение в состояние Standby.

    Два самых простых способа добиться этого - либо вывести службу на передний план (foreground service), либо дать приложению права администратора устройства. Начнем с первого варианта.

    Foreground service

    Foreground service в терминологии Android - это служба, которая имеет уведомление в шторке. Система относится к таким службам гораздо бережнее. Например, при нехватке памяти она будет убита в последнюю очередь, она не будет убита при смахивании приложения в меню управления запущенными приложениями, и да, к ней не будет применен режим Standby.

    Создать foreground service очень просто. Достаточно вставить в код службы примерно такие строки:

    Intent notificationIntent = new Intent(this, ExampleActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); Notification notification = new Notification.Builder(this) .setContentTitle(getText(R.string.notification_title)) .setContentText(getText(R.string.notification_message)) .setSmallIcon(R.drawable.icon) .setContentIntent(pendingIntent) .setTicker(getText(R.string.ticker_text)) .build(); startForeground(0, notification);

    Этот пример создает уведомление, при тапе на которое будет запущена ExampleActivity, в конце с помощью startForeground() служба переводится в статус foreground.

    Права администратора

    Другой вариант - это дать приложению права администратора. Такие права обеспечивают возможность управлять политикой формирования паролей экрана блокировки, делать удаленную блокировку и вайп устройства.

    В свое время Google ввела понятие «администратор устройства» для компаний, которые хотели бы управлять смартфонами своих сотрудников. То есть компания создает приложение, которое получает права администратора и может заблокировать или сбросить телефон после команды от сервера. Именно поэтому приложение с правами администратора не переходит в режим Standby, ведь команда на блокировку может прийти в любой момент.

    Получить, а точнее запросить права администратора опять же просто. Для начала нам понадобится пара колбэков, которые будут вызваны после того, как права получены или отозваны:

    Продолжение доступно только подписчикам

    Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

    Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов.