Страница 1 из 1
Alarm manager & Notification
Добавлено: 30 июн 2013, 12:22
avshelestov
Пытаюсь победить alarm manager.
Суть проблемы в том, что он упорно не хочет повторять действие более 2-х раз.
Устанавливаю следующим образом:
Код: Выделить всё
Intent myIntent = new Intent(context, MyService.class);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
cal.set(Calendar.MINUTE, timePicker.getCurrentMinute());
alarmManager.cancel(pendingIntent);
alarmManager.setInexactRepeating(AlarmManager.RTC, cal.getTimeInMillis(), 1000*15, pendingIntent);
Задается дата, от нее каждые 15 секунд должен должен вываливаться нотификейшн, НО показывается он только 2 раза. Первый раз ровно в то время, которое установлено в cal.getTimeInMillis() и второй через 15 секунд.
После тишина.
Может кто ниюудь показать куда копать?
Re: Alarm manager & Notification
Добавлено: 30 июн 2013, 20:46
neoksi
Ошибка в 12 строке, первый параметр должен быть с эластичностью, сейчас точно не помню константа как называется.
Re: Alarm manager & Notification
Добавлено: 30 июн 2013, 20:51
avshelestov
neoksi писал(а):Ошибка в 12 строке, первый параметр должен быть с эластичностью, сейчас точно не помню константа как называется.
Там все что есть это RTC_WAKEUP и RTC.
А что имеется ввиду под "эластичность"?
Re: Alarm manager & Notification
Добавлено: 01 июл 2013, 02:14
neoksi
avshelestov писал(а):neoksi писал(а):Ошибка в 12 строке, первый параметр должен быть с эластичностью, сейчас точно не помню константа как называется.
Там все что есть это RTC_WAKEUP и RTC.
А что имеется ввиду под "эластичность"?
Вот, кусок из рабочего кода:
[syntax=java]alarmManager.setRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + (2*60*1000),
(long) (getSyncInterval()*60*1000),
pendingIntent_refresh);[/syntax]
Под эластичностью я имел ввиду "ELAPSED_REALTIME_WAKEUP", просто прошлый код писал с телефона и не мог вспомнить как точно называется константа.
П.С. А тут хорошая статья на эту тему:
http://www.mobilab.ru/androiddev/androi ... orial.html
Re: Alarm manager & Notification
Добавлено: 01 июл 2013, 07:04
avshelestov
Спасибо. Попробую.
Re: Alarm manager & Notification
Добавлено: 01 июл 2013, 17:10
avshelestov
К сожалению мне этот вариант совсем не подходит.
Мне нужно вызывать alarmmanager каждые сутки в установленное пользователем время.
А тут как я понял устнанавливается время с последней загрузки и интервал.
Re: Alarm manager & Notification
Добавлено: 01 июл 2013, 19:48
avshelestov
Вопрос решен.
Поставил условие и забыл позже удалить.

Re: Alarm manager & Notification
Добавлено: 08 мар 2015, 17:25
mitra
У меня вопрос. Чтобы запускать сервис в 9-0-0 утра каждый день, правильно ли я написал код?
Код: Выделить всё
public void onReceive(Context arg0, Intent arg1) {
Intent intent = new Intent(arg0, MyService.class);
//создаем ожидающее намерение
PendingIntent pi = PendingIntent.getService(arg0, 1, intent, 0);
//создаем сигнализацию для вызова сервиса уведомлений
AlarmManager am = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
// Вывести устройство из спящего режима и запускать Сигнализацию
// каждые 24 часа
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
Re: Alarm manager & Notification
Добавлено: 08 мар 2015, 18:31
doter.ua
mitra писал(а):У меня вопрос. Чтобы запускать сервис в 9-0-0 утра каждый день, правильно ли я написал код?
Код: Выделить всё
public void onReceive(Context arg0, Intent arg1) {
Intent intent = new Intent(arg0, MyService.class);
//создаем ожидающее намерение
PendingIntent pi = PendingIntent.getService(arg0, 1, intent, 0);
//создаем сигнализацию для вызова сервиса уведомлений
AlarmManager am = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 9);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
// Вывести устройство из спящего режима и запускать Сигнализацию
// каждые 24 часа
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
Не факт, он будет подстраиваться под другие алармы. лучше рекурсивно запускать одноразовые алармы.
Re: Alarm manager & Notification
Добавлено: 21 апр 2015, 21:38
predeinay
Подскажите, что я делаю не так в простейшем примере,целый день мучаюсь.
Делаю вызов am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() +1000,1000, piIntent); по нажатию кнопки. В логах класса MyReceiver, который расширяет BroadcastReceiver, вывожу в лог информацию о том что вызывается метод onReceive.
При старте простейшего примера получаю в логах, что вызов onReceive срабатывает только один раз, а не каждую секунду как задано параметрами.
Re: Alarm manager & Notification
Добавлено: 21 апр 2015, 22:30
doter.ua
predeinay писал(а):Подскажите, что я делаю не так в простейшем примере,...
https://developer.android.com/reference ... ingIntent)
Обрати внимание на
"As of API 19, all repeating alarms are inexact. Because this method has been available since API 3, your application can safely call it and be assured that it will get similar behavior on both current and older versions of Android."
В двух словах аларм не будет срабатывать четко по расписанию, а будет подстраиваться под другой ближайший аларм. Мутная штука для сбережения энергии. Кароч юзай рекурсивные одноразовые алармы, как в постах выше.
Re: Alarm manager & Notification
Добавлено: 22 апр 2015, 08:38
predeinay
doter.ua писал(а):В двух словах аларм не будет срабатывать четко по расписанию, а будет подстраиваться под другой ближайший аларм. Мутная штука для сбережения энергии. Кароч юзай рекурсивные одноразовые алармы, как в постах выше.
т.е. использовать set за место setRepeating и в ресивере еще раз вызывать set и т.д. ?
Может я что то не понимаю, но нет ли более легко способа совершать запросы на сервер с андройда, на пример каждую минуту(!) для получения данных ?
есть требование, чтоб приложение на андройде (даже с выключенным экраном телефона) каждую минуту создавало запрос на сервер. Пробовал сделать через службы, но после выключения дисплея - запросы начинают проходить очень редко. Пробовал сделать WAKE_LOCK для службы, однако запросы все равно проходят не всегда.