- Как приостановить / спать поток или процесс в Android?
- Keeping your Android application running when the device wants to sleep (Updated for Android Pie)
- Wake Locks
- Wake lock acquired.png
- WiFi Locks
- Путеводитель по приложениям Android для контроля сна, часть 1
- Sleep as Android
- Будильник
- Отслеживание сна
- Статистика
- Дополнительные возможности
- Sleep Cycle Alarm Clock
- Отслеживание сна и статистика
- Будильник
- SleepyTime: Bedtime Calculator
- Caynax Alarm Clock
- AlarmDroid
Как приостановить / спать поток или процесс в Android?
Я хочу сделать паузу между двумя строками кода, позвольте мне объяснить немного:
-> пользователь нажимает кнопку (фактически карту), и я показываю ее, изменяя фон этой кнопки:
-> после, скажем, 1 секунды, мне нужно вернуться к предыдущему состоянию кнопки, изменив ее фон:
-> Я пытался приостановить поток между этими двумя строками кода с помощью:
Однако это не работает. Может быть, мне нужно приостановить процесс, а не поток?
Я также пытался (но это не работает):
Как я могу приостановить / спать поток или процесс?
Одним из решений этой проблемы является использование метода Handler.postDelayed () . Некоторые учебные материалы Google предлагают такое же решение.
Однако некоторые отмечают, что приведенное выше решение вызывает утечку памяти, поскольку оно использует нестатический внутренний и анонимный класс, который неявно содержит ссылку на свой внешний класс, активность. Это проблема, когда контекст активности собирается мусором.
Более сложное решение , которое позволяет избежать утечек памяти подкласса Handler и Runnable со статическими внутренними классами внутри деятельности , так как статические внутренних классы не занимающим неявную ссылки на их внешний класс:
Обратите внимание, что Runnable используется WeakReference для Activity, что необходимо в статическом классе, которому требуется доступ к пользовательскому интерфейсу.
Источник
Keeping your Android application running when the device wants to sleep (Updated for Android Pie)
Updated January 2020 to include detail about Android Pie.
Since the introduction of doze mode in Android Marshmallow we have seen a number of enterprise use cases where customers want to ensure their application continues to run even though the device wants to enter a power saving mode. It is assumed the reader is familiar with doze mode and the other changes made in Android Oreo and Pie related to background services, at least at a high level.
From a consumer point of view, getting maximum battery life out of a device is frequently an ever-present consideration, so much so that a slew of snake oil “task manager” and “task killer” applications formerly gained popularity to prevent background apps but in recent Android releases Google has taken a more aggressive approach to what apps can do in the background.
Enterprise applications are written primarily to enhance user efficiency; battery consumption will always be a consideration but may be secondary or tertiary to application responsiveness or performance.
The goal of this blog is to explain your options as an application developer to give you the most control over your device’s power management and what you can do to ensure your application is always available to your users.
There are two fundamental reasons people might not want the device to enter a power saving mode:
- The application should be available to respond to network requests, for example a push message. Often Firebase Cloud Messaging (FCM) is not a suitable option for customers because the device is behind a firewall or does not have GMS services available.
- The application needs to do work continually and it is not acceptable for the Android OS to kill the application’s background services.
Before diving into the detail, it is necessary to understand the concepts around Android power management:
Wake Locks
Wake locks are an Android concept designed to allow an application to indicate that it wants to have the device stay on, for example the YouTube application would take a FULL_WAKE_LOCK to prevent the screen turning off whilst the user is watching a video. A wake lock can control the status of the CPU, Screen and hardware Keyboard backlight but all but one type of wake lock can be cancelled by the end user simply by pressing the power key. Since only PARTIAL_WAKE_LOCKs persist when the user presses the power key the remainder of this blog will be concerned exclusively with those, where the CPU continues running but the screen and hardware keyboard backlight is allowed to turn off.
Android documentation is available for the wake lock definition as well as methods to acquire and release wake locks.
Any application requiring a wake lock must request the android permission:
You can detect any wake locks being held by applications on your device through adb:
The following screenshot shows a single wake lock is on the device, it is a partial wake lock and has been given the tag ‘WakeLockExampleAppTag1’ by the application which created it:
Wake lock acquired.png
Partial wake locks will be released either when the application which created it calls release(), or the lock was only acquired for a specified time. Note that wake locks will be automatically released when the device enters doze mode unless battery optimization is disabled for the application which acquired the lock (see later)
Whilst this blog is concerned primarily with Android Marshmallow, you may notice that earlier Zebra devices’ WiFi service gains its own partial wake lock, even when the WiFi policy is set to not «keep WiFi awake when the device is sleeping». You can see any wake lock using the technique described above and should bear this in mind if wondering why your device is not sleeping when expected on earlier devices e.g. MC40.
WiFi Locks
WiFi locks are only applicable to Android Nougat devices and below (Marshmallow, Lollipop etc). From Android Oreo onward the WiFi will always be on when the device is sleeping.
WiFi locks allow an application to keep the WLAN radio awake when the user has not used the device in a while, they are frequently used in conjunction with wake locks since any application doing work in the background would likely need WLAN connectivity (e.g. downloading a large file)
Android documentation for the WifiLock is here and the documentation on how to acquire a WiFi lock is here.
As stated in the official docs, WifiLocks cannot override the user-level “Wifi-Enabled” setting, nor Airplane Mode. For Zebra devices, we can extend this to WifiLocks not being able to override the Wi-Fi Enable / Disable setting of the WiFi CSP
Some other special considerations for Zebra devices:
- Out of the box, older Zebra devices come pre-loaded with the AppGallery client. AppGallery will be holding its own WifiLock lock and since the radio is only allowed to turn off when no WifiLocks are held, the radio will not turn off by default (until the device enters doze mode). AppGallery’s lock is defined as follows:
- WifiLock
- You can disable AppGallery in a number of ways:
- Using the MX AccessManager whitelist feature
- Using the MX ApplicationManager to disable the application
- Using Enterprise Home Screen’s preference
- Disabling the application manually under Settings —> Apps —> AppGallery —> App info
Note that the current package name is com.rhomobile.appgallery but that may change in the future.
- Zebra devices also have an additional “Sleep Policy” parameter as part of the MX Wifi Manager
- You can set the sleep policy via the Settings UI: Settings —> Wi-Fi —> (Menu) Advanced —> “Keep Wi-Fi on during sleep”. The values are:
- Always (the WiFi radio will not turn off when the device sleeps)
- ‘Only when plugged in’ (the WiFi radio will not turn off provided the device is connected to power)
- Never (the WiFi radio will be allowed to turn off when the device sleeps)
- The sleep policy does not hold a separate WiFi lock, it is configuring the WiFi policy and is reflected in the mSleepPolicy value.
- The default value of the sleep policy will vary from device to device. As a general rule, devices running Marshmallow or earlier will have this value set to ‘Never’ and devices running Nougat or later will set this value to ‘Always’ but there will be exceptions (notably the TC8000, a Lollipop device, defaults to ‘Always’).
- For a consistent staging experience across all devices it is recommended to use StageNow’s WifiSleepPolicy parameter
- The device will only turn WiFi off during standby if there are no WiFi locks and it is allowed to do so according to the WiFi sleep policy
- You can set the sleep policy via the Settings UI: Settings —> Wi-Fi —> (Menu) Advanced —> “Keep Wi-Fi on during sleep”. The values are:
- When the device receives a network request over WiFi, the device obviously needs to do some processing to handle the message. Although this requires hardware support from the WiFi stack and processor, recent Zebra devices will be able to wake the processor to perform the required packet handling. If more than simple processing is required when packets are received it may be prudent to also acquire a wake lock for the duration of that processing. This is true of all Android Marshmallow or later devices.
You can detect any wifi locks being held by applications on your device through adb:
The following screenshot shows a single wifi lock is on the device (in blue) and is given the tag ‘WifiLockExampleAppTag1’ by the application which created it. Highlighted in green is the mSleepPolicy variable which can be used to determine the WiFi sleep policy, here 0 is ‘Never’ keep WiFi on during sleep but a value of 2 would indicate ‘Always’ keep WiFi on during sleep.:
Источник
Путеводитель по приложениям Android для контроля сна, часть 1
Благодаря датчикам в смартфонах, некоторые приложения Android могут решать жизненно важные задачи — например, отслеживание сна. Для этих целей используется акселерометр, который реагирует на движения и фиксирует показания на графике. Этот график отображает стадии сна и позволяет взглянуть на процесс со стороны.
Приложения для отслеживания сна — идея, здравая во всех смыслах, и научно обоснованная. И хотя смартфон или планшет не являются заменой «умных» гаджетов, тем не менее, пользу от подобных программ оценить будет интересно. Для этого можно сделать хотя бы несколько тестовых записей актиграфии, то есть двигательной активности во время сна.
В путеводителе мы рассмотрим приложения для Android, так или иначе относящиеся ко сну. Прежде всего, это программы для отслеживания отдыха. В качестве дополнения следуют будильники и приложения для релаксации и засыпания.
Участники первой части путеводителя:
- Sleep as Android
- Sleep Cycle Alarm Clock
Также будут упомянуты:
- SleepyTime: Bedtime Calculator
- Caynax Alarm Clock
- AlarmDroid
Sleep as Android
Sleep as Android — одно из широко известных приложений для контроля сна. Основные функции: запись актиграфии сна, просмотр статистики, управление будильниками и «умное пробуждение». Кроме того, программа умеет определять и предотвращать храп, дает советы, которые помогут сделать сон более эффективным.
Sleep as Android работает в ознакомительном режиме 2 недели, после чего переходит в режим ограниченной работы и требует ввести код разблокировки. Цена полной версии — $3,06.
Будильник
Вначале рассмотрим возможности т. н. «умного будильника». Его особенность, в сравнении со стандартным будильником, состоит в следующем: пробуждение происходит не в точно заданное время, а в наиболее оптимальный момент между циклами сна. Если проснуться во время цикла, то эффективность сна существенно снижается, в то время как просыпание в промежутке между ними позволит лучше отдохнуть.
Можно не только запланировать, но и установить определенный режим пробуждения — более или менее лояльный. Дополнительно, пользователь может указать «длительность дремы».
На тот случай, если он не проснулся окончательно, Sleep as Android включает проверку бодрствования. Работает она в следующим образом: дается задача, которую нужно решить для отключения сигнала. Это может быть ввод цифр с картинки, простейший арифметический пример, тряска или другие варианты различной сложности.
Отслеживание сна
Сейчас — непосредственно о функциях отслеживания сна в Sleep as Android. До начала записи можно выставить желаемые настройки — например, включить запись шумов во время сна, антихрап. Антихрап — достаточно любопытная и в ряде случаев, видимо, полезная опция: телефон вибрирует по достижению порога шума и предупреждает о том, что желательно спать тише.
Sleep as Android не предусматривает калибровки, поэтому проверить чувствительность сенсора можно только опытным путем: начать отслеживание, остановить запись и взглянуть на полученный график.
Нужно также отметить, что все программы данной категории достаточно быстро расходуют батарею, поэтому необходимо, чтобы телефон был подключен к источнику зарядки весь период отслеживания. Впрочем, иногда это и не требуется ¬— можно просто включить автономный режим на время записи.
После пробуждения, пользователь останавливает запись и фиксирует показания. Опционально, можно указать рейтинг — то есть, впечатления от сна — и категории. Категории позволяют уточнить состояние незадолго до сна: прием алкоголя, стресс, плохое настроение и т. д. Все это имеет ценность не только для ведения своего рода дневника, но и для детализации статистики и советов, выдаваемых программой.
Статистика
В результате, на графике Sleep as Android отобразятся циклы сна, где можно отличить:
- глубокий сон — в этот период совершается минимальное количество движений
- легкий сон — когда происходит больше движений
- REM-сон (быстрый сон) — период, во время которого, чаще всего, снятся сны. Этот показатель — экспериментальный и весьма условный: очевидно, что его нельзя зафиксировать, используя приложение и сенсор мобильного устройства.
Соответственно, уже исходя из этого, пользователь может понять, насколько полноценным был сон. Конечно, представленные данные упрощены (на самом деле, фаз больше), и здесь нужно учитывать, что статистика строится только на показаниях акселерометра по принципу: чем больше движений, тем «легче» сон. Тем не менее, полученных сведений вполне достаточно для исследований.
Здесь будет уместно привести полезную информацию со страницы разработчика:
Здоровый сон длится 7-8 часов и содержит 5 циклов сна. Первый цикл длится 70-100 минут, последующие — дольше, но они «легче». Каждый цикл состоит из 5 стадий по 5-15 минут. Стадии 1 и 2 — легкий сон, лучшее время для просыпания. График здорового сна выглядит так: 10-30 минут легкого сна (высокие пики), сопровождаемый стадиями глубокого сна с меньшими пиками или без них, длящимися от 40 до 100 минут.
При выборе графика актиграфии, также несложно ознакомиться с такими показателями как: дефицит сна, циклы глубокого сна. Можно сегментировать данные по дням, тегам, категориям, вносить пометки.
В дополнение к этому, можно послушать записи т. н. шумов — то есть, звуков, произведенных за время сна. При этом, заранее нужно удостовериться, что во время отслеживания запись будет производиться.
Впрочем, практика показала, что программа не отличает равномерное глубокое дыхание от храпа, и в результате статистика может отражать не вполне достоверные сведения. Соответственно, в аудиозаписи будет несколько часов дыхания. Решение проблемы — поэкспериментировать с расположением телефона от источника, снизить чувствительность микрофона в настройках приложения. Затем проанализировать графики записи и прослушать те, где наиболее заметны колебания.
Полезные советы в Sleep as Android являются необязательным бонусом. Они доступны только при достаточном количестве статистики — в течение недели или как минимум нескольких дней.
Дополнительные возможности
Последнее, что можно отметить, это и различные дополнения, которые можно установить в Sleep as Android: дополнительные усыпляющие звуки (Lullaby Addon), резервное копирование (SleepCloud Backup), привязка к гаджетам Pebble, Android Wear (дополнение «Носимые устройства») и др.
Резюме. Sleep as Android — один из безусловных фаворитов обзора. Понятный интерфейс, наиболее полный набор функций, детальная статистика, в том числе аудиозаписи в процессе сна. Стоит утверждать, что приложение извлекает из сна все полезное, насколько это возможно с использованием не специализированного мобильного устройства. Кроме того, Sleep as Android можно использовать как гибко настраиваемый, адаптируемый будильник.
Sleep Cycle Alarm Clock
Sleep Cycle Alarm Clock — еще один «интеллигентный» будильник, который отслеживает сон и будит в оптимальное время. Большая часть функций статистики в ознакомительной версии недоступна, стоимость приложения составляет $1,59.
Отслеживание сна и статистика
Как и положено, программа ведет наблюдение за движениями с помощью акселерометра. Рассчитывает оптимальный интервал в 30 минут между циклами, в который срабатывает будильник.
Перед отслеживанием, рекомендуется провести калибровку, и для этого в Sleep Cycle Alarm Clock есть соответствующие инструкции и тест. Во время этого теста, нужно положить мобильное устройство рядом с местом сна и сделать несколько движений, чтобы сработал сигнал.
В результате, программа собирает детальную статистку, включая графики по каждой ночи и любой записанной сессии: сколько времени ушло на отдых, качество сна, средние показатели за указанный период.
На графике показаны 3 стадии сна: Awake (бодрствование), Sleep (сон) и Deep sleep (глубокий сон).
По колебаниям графика вполне несложно понять, как проходил сон. На корректном графике показатели должны четко отличаться друг от друга, в то время как неправильная калибровка или отсутствие сна сделают статистику менее четкой. С примерами графиков можно ознакомиться тут.
Кроме того, в Sleep Cycle Alarm Clock можно ознакомиться с графиками за длительные периоды, при наличии достаточного количества данных (за 5 и более дней): тенденции на протяжении недели и дольше; время, затраченное на сон, время отхода ко сну, качество сна и т. д.
Нужно отметить, что по своим возможностям программа все же не дотягивает до Sleep as Droid. Хотя бы потому, что нельзя записывать звук. В то же время, можно оставлять пометки о качестве сна — для этого нужно активировать опцию Sleep notes в настройках программы. Вместо рейтинга сна можно указывать настроение — оно будет отображаться на шкале статистики.
Будильник
Будильник в Sleep Cycle Alarm Clock настраивается достаточно детально. Это настройка звука, мелодия, вибрация. Кроме того, можно активировать режим отложенного сна при встряхивании или нажатии на телефон. Это лимит, который учитывается как цикл сна, указанный пользователем, то есть, интеллигентное пробуждение.
Резюме. Sleep Cycle Alarm Clock — достаточно простой инструмент для комфортного пробуждения. Наиболее полезный компонент — будильник, который будит между циклами сна. В плане статистики, несмотря на множество графиков, предоставляется сравнительно немного полезной информации.
SleepyTime: Bedtime Calculator
Основная задача SleepyTime — разбудить пользователя в промежуток между циклами сна. Как уже говорилось, это время будет оптимальным, если его правильно рассчитать и проснуться в нужный момент.
Приложение помогает не только «встать с той ноги», но также оптимизировать время сна. Поддерживается 3 метода настройки будильника:
- Установка времени для засыпания
- Установка времени для просыпания
- Я засну сейчас.
После выбора одной из опций, SleepyTime рассчитывает время и предлагает список возможного времени для пробуждения или сна соответственно.
Вместе с мобильным приложением, по адресу sleepyti.me доступен аналогичный онлайн-сервис. Полезен он тем, что позволяет вычислить оптимальное время для пробуждения. Пользователь вводит время — появляется 4 варианта с интервалом в 30 минут, когда желательно проснуться.
Впрочем, ни сервис, ни приложение не учитывают показания датчика Android, поэтому относиться к подобным рекомендациям можно соответственно. Вполне возможны погрешности в целом: программа рассчитывает на то, что пользователь уснет за 14 минут или другое, точно указанное, время.
Caynax Alarm Clock
Согласно описанию, данному разработчиками, Caynax Alarm Clock — это не только будильник, но еще и менеджер задач. Тем не менее, непонятно, как здесь создавать todo-списки или нечто схожее.
В Caynax Alarm Clock будильники распределены по категориям: разовые, ежедневные, по рабочим дням, по календарю и по праздникам, циклические. Как ни странно, сюда же относятся таймеры. Будильниками удобно управлять, когда их несколько: можно быстро создавать и при ненадобности отключать — все сразу и одним нажатием кнопки.
Каждый будильник содержит ряд полезных опций. Во-первых, за каждым будильником закреплен профиль (доступно только в pro-версии). Во-вторых, пробуждение может быть «мягким» или «жестким». Возможен перенос будильника на другое время, при его срабатывании (отложенный режим), преодоление препятствия (задача или фраза, где нужно поменять порядок слов).
Также через настройки можно назначить управление будильником на клавиши громкости, поведение при повороте экрана или тряске устройства. Что касается управления, здесь также будет полезен настраиваемый виджет.
AlarmDroid
AlarmDroid — пожалуй, один из самых функциональных будильников для Android. Будет полезен тем, кто испытывает трудности не столько при засыпании, сколько при пробуждении.
Помимо удобного управления будильниками (создание/удаление/сортировка), можно гибко настраивать каждый из них. Так, AlarmDroid позволяет задавать повторы, интервал нарастания звука, изменять режимы.
Для переноса будильника на другое время достаточно перевернуть или встряхнуть устройство (функция flip’n’snooze:). Если, наоборот, востребован более «строгий» будильник, можно настроить всевозможные препятствия: математическая задача, сортировка или выбор кратных чисел, дня недели и т. д. Этой функцией AlarmDroid похож на упомянутое приложение Caynax Alarm Clock.
О других особенностях. В наличии ассистент, который умеет озвучивать время, день и текущую погоду. Впрочем, несмотря на присутствие русского синтеза речи среди множества других языков, AlarmDroid упорно озвучивал время только на английском. Функция эта не то чтобы актуальна (в большинстве случаев), но полезна для людей со слабым зрением или другими ограничениями.
Источник