Страница 1 из 2
Сервис уходит в паузу при блокировке телефона
Добавлено: 18 дек 2012, 21:19
powercat
Уточненная информация - сервис уходит в паузу, когда телефон блокируется (нажатием кнопы power). Логи подтверждают паузу в районе onStartCommand, пауза равна времени блокировки. После разблокировки выполнение продолжается с места остановки в паузу.
Как это победить? Сервис должен работать при блокированном теле.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 17:23
powercat
Вот такая комбинация решает проблему и уведомления, кои сидят в таймертаске, сидящем в onStartCommande сервиса, приходят нормально.
Код: Выделить всё
public class MyService extends Service{
..........
PowerManager mgr;
WakeLock wakeLock;
public void onCreate(){
..........................
super.onCreate();
nm=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mgr = (PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
}
Но - непонятно, где вставлять wakeLock.relise();....онДестрой я не вызываю, после отправки уведомления оно не вставляется, значит будет тратится лишняя энергия телефона, если не вставить где-нить....
И непонятно, будет ли это применяться к таймертаску, который выполнятеся регулярно, а не разово...
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 17:29
neoksi
Все через AlarmManager и тогда проблем с засыпанием нет.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 17:33
powercat
тогда есть проблемы с формированием уведомления - мне надо задать время отправки уведомления, периодичность, сформировать само уведомление, количество, которое будет отображаться в баре...не помню почему, но алармманагер не подошел, я его пробовал на эту роль, вместо NotificationManager
Да и проблема тут в том, что СЕРВИС в паузу входит, а не конкретный манагер внутри него ((( т.е. onStartCommand прерывается, можно сказать
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 17:47
neoksi
powercat
Я тоже думал, что AlarmManager не подойдет, пока не сформировал для него определенные URI для каждого сообщения.
Далее все просто, броадкаст ресивер получает URI от аларманеджера, парсит и проверяет его, если ок, предает данные в отдельный метод, который генерирует уже уведомление.
А по поводу того, что сервис уходит в паузу, так делай при старте onStartCommand wakeLock.relise(), а по завершении метода wakeLock.relise().
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 17:55
powercat
смотри...у меня в онСтарКомманде сидит таймертаск, который постоянно (раз в 24 часа) должен слать уведомления. Т.е., насколько я понимаю, у меня действия не выходят из онСтартКомманда и постоянно там крутятся, т.е. wakeLock.relise(); у меня не будет выполняться? Правильно?
И еще, для справки хочу понять - такие шняжки, типа будильника, они же по-идее, тоже должны постоянно крутиться в сервисе, т.к. у них периодичность, т.е. они тоже не юзают wakeLock.relise(); ?
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 19:10
neoksi
Они все юзают АлармМенеджер, подключи устройство к компу и в LogCat отсортируй все по тегу AlarmManager. Сразу увидишь как все эти программы будильников и т.д. работают.
Срабатывание аларм менеджера раз в 24 часа настроить очень просто, аналогично он у меня срабатывает раз в пять минут и стартует сервис синхронизации данных.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 20:09
powercat
Вот такая у меня программа - в активити задаются две встречи, которые происходят периодически. У одной период раз в два дня, у второй - раз в день. Они вносятся в базу, и задается их периодичность 1 день и 2 дня. Там же, в активити задается время, в которое я хочу получать напоминания об этих встречах. И там же в активити кнопка Запустить сервис напоминаний. После этого активити не нужна и закрывается.
Сервис, запущенный из активити, в onStartCommand высчитывает время до срабатывания Задачи (timer.schedule), в которой, открывается база, сравниваются даты с текущей, и если условия выполняются, то отсылается уведомление, что сегодня - день встречи. После первого старта ТаймерТаск должен выполнять эту задачу каждые 24 часа. Т.е. отсчет в таймере должен идти постоянно.
Все работает прекрасно, пока горит экран.
Как только телефон блокируется, то сервис встает в паузу в onStartCommand (я это проверил через логи). Т.е. таймер замерает. После разблокировки - таймер продолжает отсчет с места "замерания".
Таким образом я получаю ситуацию, когда сервис не должен попадать в паузу, иначе пропадает смысл всей программы.
Вопрос - правильно ли я понимаю, что в данном случае wakeLock.acquire(); не должен быть закрыт релизом? Ведь если закрыть, то после первого прохода телефон поймает блок и сервис встанет в паузу, и таймер замрет? Собственно, если я в онКрит прописываю wakeLock.acquire(); и не закрываю его, то все отлично работает, задача постоянно выполняется, сервис не впадает в паузу.
Однако, что в этом случае с энергоресурсами? И можно ли заставить сервис не впадать в паузу другим способом, аналогичным будильнику, например?
АлармМанагер в этом случае не подходит по простой причине, что он тоже должен вызываться из сервиса (помним, что время первого старта рассчитывается в сервисе, перезагрузка устройства, пользовательское отключение - все там), который может замереть...
Или я что-то конкретно не понимаю в реализации моей схемы и можно ее решить через АлармМанагер? Если можно, то можно ли рамочный пример написать?
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 20:21
neoksi
Вот хорошая статья про будильник
http://www.mobilab.ru/androiddev/androi ... orial.html
А тут пример реализации множественных событий через AlarmManager
http://stackoverflow.com/questions/6649 ... ing-events
В первой статье хорошо описаны разные параметры AlarmManager, во втором примере можно понять как работать с множеством событий.
Общий смысл в том, что сервис у тебя будет отвечать за занесение событий в аларм менеджер, а потом броадкаст ресивер их отображать. В твоем случае, всю работу, которую сейчас ты возложил на свой сервис можно передать аларм менеджеру.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 20:41
powercat
Данкс, щас погляжу...
я так понял, что АлармМанагер - аналог сервиса, который работает самостоятельно, но при этом умеет только лишь..эээ алармить
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 19 дек 2012, 21:43
neoksi
Да АлармМенеджер этот тот же сервис, который срабатывает каждую секунду проверяя свои записи, и если есть запись, то вызывает соответствующее приложения отсылая ему броадкаст с соответствующим Итентом.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 20 дек 2012, 10:31
powercat
оставил бы ты свою аську-скайп, я б там поспрашивал...не хочу еще раз сделать что-то, что не будет работать так, как хочу...
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 20 дек 2012, 18:39
powercat
Посмотрел статьи. Нарисовалась такая схема, прошу оценить ее реальность.
В активити делается расчет времени до первого разового пуска аларма, который пнет бродкастер через пендинг интент.
Бродкастер, приняв пинок, выполнит задачу, которая сейчас живет в таймертаске, но будет переселена в бродкастер. В задаче будет отправлено уведомление.
После выполнения задачи, аларм будет переустановлен на сутки и цикл повторится, но уже без активити.
Если я опять запущу активити и изменю время для пуска задачи, схема не будет нарушена - т.е. первый пуск аларма отработает нормально?
Хочу узнать, что там за флаги у аларма, которые нужны для разовостей пуска? В официальных доках, как обычно, невнятная каша (((( ...что-то для того, чтобы если уже существует, то не существовал...блин...непонятные флаги в общем
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 20 дек 2012, 18:51
neoksi
Нормальная схема.
Да, должен отработать нормально.
Через метод set аларм менеджера ты устанавливаешь разовое событие с точным временем срабатывания.
Через метод setRepeating аларм менеджера ты устанавливаешь событие, которое повторяется через равные назначенные интервалы времени.
П.С. Я лично на каждый аларм создаю свой Uri, в котором содержится нужная информация об данном аларме. В броадкасте я беру этот Uri, парсю и сравниваю данные на актуальность установок, если они актуальны, то вывожу сообщение.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 20 дек 2012, 18:53
neoksi
powercat писал(а):Хочу узнать, что там за флаги у аларма, которые нужны для разовостей пуска? В официальных доках, как обычно, невнятная каша (((( ...что-то для того, чтобы если уже существует, то не существовал...блин...непонятные флаги в общем
Для разового пуска тебе нужен флаг RTC_WAKEUP и передаешь в метод время в часовой зоне UTC+0 (Unix TimeStamp).
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 20 дек 2012, 19:18
powercat
Благодарю, буду пробовать!
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 24 дек 2012, 23:59
powercat
Вопрос - при перезагрузке телефона аларм теряется? Или его как-то можно заранее системе сказать, что этот аларм должен жить постоянно, пока не отключит пользователь? Или надо через бут его оживлять?
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 25 дек 2012, 00:17
neoksi
powercat писал(а):Вопрос - при перезагрузке телефона аларм теряется? Или его как-то можно заранее системе сказать, что этот аларм должен жить постоянно, пока не отключит пользователь? Или надо через бут его оживлять?
При перезагрузке аларм теряется, его нужно заново создать при старте устройства.
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 25 дек 2012, 12:47
powercat
т.е. все будильники по-новой строятся после перезагрузки? т.е. врем пуска т.д.?
Re: Сервис уходит в паузу при блокировке телефона
Добавлено: 25 дек 2012, 16:06
neoksi
Да.