2012-04-26 3 views
2

Каков надлежащий контекст, в котором AlarmManagers должны быть объявлены и инициализированы так, чтобы они сохранялись бесконечно (или до перезагрузки системы или до тех пор, пока Task Killer не уничтожит ее, реалистично) и избегайте мусора коллекция. Но также допускают изменения в сигнале тревоги в рамках всего приложения.Android AlarmManager прекращает стрельбу по прошествии длительного времени

Вся причина, по которой я использую AlarmManager, заключается в том, чтобы исправить необходимость работы службы в любое время. Однако, чтобы выполнить этот подвиг, где создан AlarmManager? Я бы предположил, что он не может быть создан в службе, которая затем отключается/уничтожается, потому что в конечном итоге объект тревоги исчезнет, ​​и тревоги перестанут стрелять - не так ли?

Мне понравилась идея примера AlarmManager из другого вопроса, в котором класс MyAlarm создается как расширение BroadcastReceiver для onReceive будильника, и AlarmManager инициализируется в конструкторе этого класса. Но как эта реализация работает, если экземпляр MyAlarm требуется в нескольких контекстах. Например, из обработчиков событий через несколько объектов Activity. Из обработчиков событий нескольких виджетов. В пределах рабочего обслуживания. Все это может привести к отключению или включению тревоги. Я полагаю, создайте локальный экземпляр везде, где вам нужно иметь дело с сигналом тревоги, и поскольку параметр pendingIntent одинаковый для всех экземпляров, вы фактически будете работать с виртуальным «singleton».

Это только концептуально на данный момент, потому что я понятия не имею, как я буду проверять «сбор мусора» диспетчера аварийных сигналов, который может произойти 8, 12,? спустя несколько часов, когда моя тревога просто случайно прекращает стрельбу. Моя цель состоит в том, что если телефон не перезагружен, а моя задача не была вручную убита пользователем, чтобы держать будильник в течение неограниченного времени. Спасибо

ответ

0

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

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

+0

Извините, моя цель состояла в том, чтобы использовать AlarmManager, чтобы моя служба не нуждалась в запуске. Тревога на самом деле запустит сервис, и служба будет отключена после завершения работы. Реальный вопрос: где я инициализирую этот экземпляр AlarmManager для данного pendingIntent, чтобы он оставался бегущим навсегда, даже если, скажем, служба, изначально объявленная, больше не работает? – gauglerb

+0

Служба - это всего лишь фоновый процесс, который сохраняется, так что вы можете делать такие вещи, как держать слушателя открытым. Вы не можете инициализировать AlarmManager так, чтобы он «запускался вечно», вы запускаете его в службе и поддерживаете эту службу. Как я уже сказал, вы можете упорствовать в этом, делая что-то время от времени, поэтому ОС не думает, что это мертвый процесс. Люди используют экранный будильник, так как каждый раз, когда пользователь пробуждает телефон, вы что-то делаете. Поскольку этого обычно достаточно часто, чтобы убедиться, что ОС не убивает службу, я бы попробовал это. –

0

Однако, чтобы выполнить этот подвиг, где создан AlarmManager?

AlarmManager является системным сервисом. Он «создается» операционной системой.

Я бы предположил, что он не может быть создан в службе, которая затем отключается/уничтожается, потому что объект тревоги в конце концов исчезнет с ней, и тревоги перестанут стрелять - не так ли?

AlarmManager является системным сервисом. «Тревога» удерживается операционной системой.

Я думаю, создайте локальный экземпляр везде, где вам нужно иметь дело с сигналом тревоги, и поскольку параметр pendingIntent одинаковый для всех экземпляров, вы фактически будете работать с виртуальным «singleton».

Исправить.

+0

Системный сервис, созданный ОС. Это помогает концептуализировать это, спасибо! Таким образом, после того, как запланирована повторная тревога (pendingIntent), сигнал тревоги должен исчезать неограниченно, если приложение не закрыто принудительно, задача убита, аварийный сигнал программно отменен или устройство перезагружено? Не имеет значения, откуда вызывается setRepeating (PI)? Должен ли PI быть статическим объектом или чем-то особенным, чтобы эта тревога длилась вечно при обычных обстоятельствах. Спасибо – gauglerb

+1

@ user1359312: Единственный другой сценарий, который * может вызвать проблему с сигналами тревоги, - это когда приложение обновляется, хотя я не смог воспроизвести его. В противном случае ваш список выглядит достаточно полным. «Не имеет значения, откуда вызывается setRepeating (PI)?» -- верный. «Должен ли PI быть статическим объектом или чем-то особенным, чтобы эта тревога длилась вечно при обычных обстоятельствах». - нет. – CommonsWare