Сервис уходит в паузу при блокировке телефона
Сервис уходит в паузу при блокировке телефона
Уточненная информация - сервис уходит в паузу, когда телефон блокируется (нажатием кнопы power). Логи подтверждают паузу в районе onStartCommand, пауза равна времени блокировки. После разблокировки выполнение продолжается с места остановки в паузу.
Как это победить? Сервис должен работать при блокированном теле.
Как это победить? Сервис должен работать при блокированном теле.
Re: Сервис уходит в паузу при блокировке телефона
Вот такая комбинация решает проблему и уведомления, кои сидят в таймертаске, сидящем в onStartCommande сервиса, приходят нормально.
Но - непонятно, где вставлять wakeLock.relise();....онДестрой я не вызываю, после отправки уведомления оно не вставляется, значит будет тратится лишняя энергия телефона, если не вставить где-нить....
И непонятно, будет ли это применяться к таймертаску, который выполнятеся регулярно, а не разово...
Код: Выделить всё
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();
}И непонятно, будет ли это применяться к таймертаску, который выполнятеся регулярно, а не разово...
Re: Сервис уходит в паузу при блокировке телефона
Все через AlarmManager и тогда проблем с засыпанием нет.
Re: Сервис уходит в паузу при блокировке телефона
тогда есть проблемы с формированием уведомления - мне надо задать время отправки уведомления, периодичность, сформировать само уведомление, количество, которое будет отображаться в баре...не помню почему, но алармманагер не подошел, я его пробовал на эту роль, вместо NotificationManager
Да и проблема тут в том, что СЕРВИС в паузу входит, а не конкретный манагер внутри него ((( т.е. onStartCommand прерывается, можно сказать
Да и проблема тут в том, что СЕРВИС в паузу входит, а не конкретный манагер внутри него ((( т.е. onStartCommand прерывается, можно сказать
Re: Сервис уходит в паузу при блокировке телефона
powercat
Я тоже думал, что AlarmManager не подойдет, пока не сформировал для него определенные URI для каждого сообщения.
Далее все просто, броадкаст ресивер получает URI от аларманеджера, парсит и проверяет его, если ок, предает данные в отдельный метод, который генерирует уже уведомление.
А по поводу того, что сервис уходит в паузу, так делай при старте onStartCommand wakeLock.relise(), а по завершении метода wakeLock.relise().
Я тоже думал, что AlarmManager не подойдет, пока не сформировал для него определенные URI для каждого сообщения.
Далее все просто, броадкаст ресивер получает URI от аларманеджера, парсит и проверяет его, если ок, предает данные в отдельный метод, который генерирует уже уведомление.
А по поводу того, что сервис уходит в паузу, так делай при старте onStartCommand wakeLock.relise(), а по завершении метода wakeLock.relise().
Re: Сервис уходит в паузу при блокировке телефона
смотри...у меня в онСтарКомманде сидит таймертаск, который постоянно (раз в 24 часа) должен слать уведомления. Т.е., насколько я понимаю, у меня действия не выходят из онСтартКомманда и постоянно там крутятся, т.е. wakeLock.relise(); у меня не будет выполняться? Правильно?
И еще, для справки хочу понять - такие шняжки, типа будильника, они же по-идее, тоже должны постоянно крутиться в сервисе, т.к. у них периодичность, т.е. они тоже не юзают wakeLock.relise(); ?
И еще, для справки хочу понять - такие шняжки, типа будильника, они же по-идее, тоже должны постоянно крутиться в сервисе, т.к. у них периодичность, т.е. они тоже не юзают wakeLock.relise(); ?
Re: Сервис уходит в паузу при блокировке телефона
Они все юзают АлармМенеджер, подключи устройство к компу и в LogCat отсортируй все по тегу AlarmManager. Сразу увидишь как все эти программы будильников и т.д. работают.
Срабатывание аларм менеджера раз в 24 часа настроить очень просто, аналогично он у меня срабатывает раз в пять минут и стартует сервис синхронизации данных.
Срабатывание аларм менеджера раз в 24 часа настроить очень просто, аналогично он у меня срабатывает раз в пять минут и стартует сервис синхронизации данных.
Re: Сервис уходит в паузу при блокировке телефона
Вот такая у меня программа - в активити задаются две встречи, которые происходят периодически. У одной период раз в два дня, у второй - раз в день. Они вносятся в базу, и задается их периодичность 1 день и 2 дня. Там же, в активити задается время, в которое я хочу получать напоминания об этих встречах. И там же в активити кнопка Запустить сервис напоминаний. После этого активити не нужна и закрывается.
Сервис, запущенный из активити, в onStartCommand высчитывает время до срабатывания Задачи (timer.schedule), в которой, открывается база, сравниваются даты с текущей, и если условия выполняются, то отсылается уведомление, что сегодня - день встречи. После первого старта ТаймерТаск должен выполнять эту задачу каждые 24 часа. Т.е. отсчет в таймере должен идти постоянно.
Все работает прекрасно, пока горит экран.
Как только телефон блокируется, то сервис встает в паузу в onStartCommand (я это проверил через логи). Т.е. таймер замерает. После разблокировки - таймер продолжает отсчет с места "замерания".
Таким образом я получаю ситуацию, когда сервис не должен попадать в паузу, иначе пропадает смысл всей программы.
Вопрос - правильно ли я понимаю, что в данном случае wakeLock.acquire(); не должен быть закрыт релизом? Ведь если закрыть, то после первого прохода телефон поймает блок и сервис встанет в паузу, и таймер замрет? Собственно, если я в онКрит прописываю wakeLock.acquire(); и не закрываю его, то все отлично работает, задача постоянно выполняется, сервис не впадает в паузу.
Однако, что в этом случае с энергоресурсами? И можно ли заставить сервис не впадать в паузу другим способом, аналогичным будильнику, например?
АлармМанагер в этом случае не подходит по простой причине, что он тоже должен вызываться из сервиса (помним, что время первого старта рассчитывается в сервисе, перезагрузка устройства, пользовательское отключение - все там), который может замереть...
Или я что-то конкретно не понимаю в реализации моей схемы и можно ее решить через АлармМанагер? Если можно, то можно ли рамочный пример написать?
Сервис, запущенный из активити, в onStartCommand высчитывает время до срабатывания Задачи (timer.schedule), в которой, открывается база, сравниваются даты с текущей, и если условия выполняются, то отсылается уведомление, что сегодня - день встречи. После первого старта ТаймерТаск должен выполнять эту задачу каждые 24 часа. Т.е. отсчет в таймере должен идти постоянно.
Все работает прекрасно, пока горит экран.
Как только телефон блокируется, то сервис встает в паузу в onStartCommand (я это проверил через логи). Т.е. таймер замерает. После разблокировки - таймер продолжает отсчет с места "замерания".
Таким образом я получаю ситуацию, когда сервис не должен попадать в паузу, иначе пропадает смысл всей программы.
Вопрос - правильно ли я понимаю, что в данном случае wakeLock.acquire(); не должен быть закрыт релизом? Ведь если закрыть, то после первого прохода телефон поймает блок и сервис встанет в паузу, и таймер замрет? Собственно, если я в онКрит прописываю wakeLock.acquire(); и не закрываю его, то все отлично работает, задача постоянно выполняется, сервис не впадает в паузу.
Однако, что в этом случае с энергоресурсами? И можно ли заставить сервис не впадать в паузу другим способом, аналогичным будильнику, например?
АлармМанагер в этом случае не подходит по простой причине, что он тоже должен вызываться из сервиса (помним, что время первого старта рассчитывается в сервисе, перезагрузка устройства, пользовательское отключение - все там), который может замереть...
Или я что-то конкретно не понимаю в реализации моей схемы и можно ее решить через АлармМанагер? Если можно, то можно ли рамочный пример написать?
Re: Сервис уходит в паузу при блокировке телефона
Вот хорошая статья про будильник http://www.mobilab.ru/androiddev/androi ... orial.html
А тут пример реализации множественных событий через AlarmManager http://stackoverflow.com/questions/6649 ... ing-events
В первой статье хорошо описаны разные параметры AlarmManager, во втором примере можно понять как работать с множеством событий.
Общий смысл в том, что сервис у тебя будет отвечать за занесение событий в аларм менеджер, а потом броадкаст ресивер их отображать. В твоем случае, всю работу, которую сейчас ты возложил на свой сервис можно передать аларм менеджеру.
А тут пример реализации множественных событий через AlarmManager http://stackoverflow.com/questions/6649 ... ing-events
В первой статье хорошо описаны разные параметры AlarmManager, во втором примере можно понять как работать с множеством событий.
Общий смысл в том, что сервис у тебя будет отвечать за занесение событий в аларм менеджер, а потом броадкаст ресивер их отображать. В твоем случае, всю работу, которую сейчас ты возложил на свой сервис можно передать аларм менеджеру.
Re: Сервис уходит в паузу при блокировке телефона
Данкс, щас погляжу...
я так понял, что АлармМанагер - аналог сервиса, который работает самостоятельно, но при этом умеет только лишь..эээ алармить
я так понял, что АлармМанагер - аналог сервиса, который работает самостоятельно, но при этом умеет только лишь..эээ алармить
Re: Сервис уходит в паузу при блокировке телефона
Да АлармМенеджер этот тот же сервис, который срабатывает каждую секунду проверяя свои записи, и если есть запись, то вызывает соответствующее приложения отсылая ему броадкаст с соответствующим Итентом.
Re: Сервис уходит в паузу при блокировке телефона
оставил бы ты свою аську-скайп, я б там поспрашивал...не хочу еще раз сделать что-то, что не будет работать так, как хочу...
Re: Сервис уходит в паузу при блокировке телефона
Посмотрел статьи. Нарисовалась такая схема, прошу оценить ее реальность.
В активити делается расчет времени до первого разового пуска аларма, который пнет бродкастер через пендинг интент.
Бродкастер, приняв пинок, выполнит задачу, которая сейчас живет в таймертаске, но будет переселена в бродкастер. В задаче будет отправлено уведомление.
После выполнения задачи, аларм будет переустановлен на сутки и цикл повторится, но уже без активити.
Если я опять запущу активити и изменю время для пуска задачи, схема не будет нарушена - т.е. первый пуск аларма отработает нормально?
Хочу узнать, что там за флаги у аларма, которые нужны для разовостей пуска? В официальных доках, как обычно, невнятная каша (((( ...что-то для того, чтобы если уже существует, то не существовал...блин...непонятные флаги в общем
В активити делается расчет времени до первого разового пуска аларма, который пнет бродкастер через пендинг интент.
Бродкастер, приняв пинок, выполнит задачу, которая сейчас живет в таймертаске, но будет переселена в бродкастер. В задаче будет отправлено уведомление.
После выполнения задачи, аларм будет переустановлен на сутки и цикл повторится, но уже без активити.
Если я опять запущу активити и изменю время для пуска задачи, схема не будет нарушена - т.е. первый пуск аларма отработает нормально?
Хочу узнать, что там за флаги у аларма, которые нужны для разовостей пуска? В официальных доках, как обычно, невнятная каша (((( ...что-то для того, чтобы если уже существует, то не существовал...блин...непонятные флаги в общем
Re: Сервис уходит в паузу при блокировке телефона
Нормальная схема.
Да, должен отработать нормально.
Через метод set аларм менеджера ты устанавливаешь разовое событие с точным временем срабатывания.
Через метод setRepeating аларм менеджера ты устанавливаешь событие, которое повторяется через равные назначенные интервалы времени.
П.С. Я лично на каждый аларм создаю свой Uri, в котором содержится нужная информация об данном аларме. В броадкасте я беру этот Uri, парсю и сравниваю данные на актуальность установок, если они актуальны, то вывожу сообщение.
Да, должен отработать нормально.
Через метод set аларм менеджера ты устанавливаешь разовое событие с точным временем срабатывания.
Через метод setRepeating аларм менеджера ты устанавливаешь событие, которое повторяется через равные назначенные интервалы времени.
П.С. Я лично на каждый аларм создаю свой Uri, в котором содержится нужная информация об данном аларме. В броадкасте я беру этот Uri, парсю и сравниваю данные на актуальность установок, если они актуальны, то вывожу сообщение.
Re: Сервис уходит в паузу при блокировке телефона
Для разового пуска тебе нужен флаг RTC_WAKEUP и передаешь в метод время в часовой зоне UTC+0 (Unix TimeStamp).powercat писал(а):Хочу узнать, что там за флаги у аларма, которые нужны для разовостей пуска? В официальных доках, как обычно, невнятная каша (((( ...что-то для того, чтобы если уже существует, то не существовал...блин...непонятные флаги в общем
Re: Сервис уходит в паузу при блокировке телефона
Благодарю, буду пробовать!
Re: Сервис уходит в паузу при блокировке телефона
Вопрос - при перезагрузке телефона аларм теряется? Или его как-то можно заранее системе сказать, что этот аларм должен жить постоянно, пока не отключит пользователь? Или надо через бут его оживлять?
Re: Сервис уходит в паузу при блокировке телефона
При перезагрузке аларм теряется, его нужно заново создать при старте устройства.powercat писал(а):Вопрос - при перезагрузке телефона аларм теряется? Или его как-то можно заранее системе сказать, что этот аларм должен жить постоянно, пока не отключит пользователь? Или надо через бут его оживлять?
Re: Сервис уходит в паузу при блокировке телефона
т.е. все будильники по-новой строятся после перезагрузки? т.е. врем пуска т.д.?