User Tools

Site Tools


alarmmanager

AlarmManager существовал с первой версии PalmOS. Эта библиотека предназначалась для самой естественной задачи: вызов программы в заранее заданное время. Что умеет AlarmManager?

AlarmManager позволяет задать для каждой программы время, в которое она будет вызвана. В заданное время вне зависимости от состояния устройства (сон или активная работа), PalmOS передаст управление программе. Стоит учесть, что программа может задать только одно время активации. Если программа, как Datebook, позволяет вызвать несколько напоминаний, то только самое раннее время следует передавать в AlarmManager. Все остальные алармы следует передавать по мере их активации. После каждого системного ресета программа должна заново восстанавливать свои алармы. Дискретность указания аларма достаточно большая - 1 секунда.

Аларм вызывается в указанное время. Строго говоря, он будет активирован в ближайжее подходящее время после заданного для аларма. подходящее время обозначает, что системная очередь сообщений будет активна. Если же во время, указанное для аларма, будут рассчитываться ряды Фурье, то до окончания счета аларм не будет вызван

Как происходит вызов аларма? Вызов осуществляется в две фазы: фаза действия и фаза показа. Для каждой фазы программа вызывается со специфическим кодом вызова.

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

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

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

  • Напоминание пользователю, аналогичное Datebook. Во время фазы действия программа запускает звуковое напоминание, а во время фазы показа выдается форма с текстом напоминания.
  • Системная программа, например бэкап. Программа активизируется во время фазы действия, делает черное дело и выходит.

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

В чем заключаются основные проблемы в использовании AlarmManager? Основной проблемой является обработка последовательных алармов. Если Datebook активизирует десяток напоминаний, то для выхода в активную программу нужно закрыть все десять окон. Для сложных системных программ типа бэкапов возникает дилемма - в какой фазе бэкапиться? Если бэкапиться в фазе действия, то вывод интерфейса не очень симпатичен, а любой alert просто застопорит дальнейшую обработку алармов (для сброса таких алертов я написал FriendlyAlarm ). А если бэкапиться в фазе показа, то показ любого аларма, произошедщий раньше не позволить запустить бэкап. Для решения части проблем был реализован AttentionManager.

Другой неприятностью является тот факт, что после пробуждения из спячки и исполнения аларма, экран остается включенным в лучшем случае на время автовыключения, а в худшем - до снятия с кредла (если включена опция stay in cradle). К сожалению PalmOS API не позволяет определить состояние машины перед активацией экрана, поэтому часто программы сами пытаются выключать экраны, независимо от активности пальмы перед запуском аларма.

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

alarmmanager.txt · Last modified: 2003/12/08 18:44 by 127.0.0.1