Alarm manager & Notification

Ответить
Аватара пользователя
avshelestov
Сообщения: 61
Зарегистрирован: 31 окт 2012, 18:51

Alarm manager & Notification

Сообщение avshelestov » 30 июн 2013, 12:22

Пытаюсь победить 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 секунд.
После тишина.

Может кто ниюудь показать куда копать?
Последний раз редактировалось avshelestov 30 июн 2013, 20:51, всего редактировалось 1 раз.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Alarm manager & Notification

Сообщение neoksi » 30 июн 2013, 20:46

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

Аватара пользователя
avshelestov
Сообщения: 61
Зарегистрирован: 31 окт 2012, 18:51

Re: Alarm manager & Notification

Сообщение avshelestov » 30 июн 2013, 20:51

neoksi писал(а):Ошибка в 12 строке, первый параметр должен быть с эластичностью, сейчас точно не помню константа как называется.
Там все что есть это RTC_WAKEUP и RTC.
А что имеется ввиду под "эластичность"?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Alarm manager & Notification

Сообщение neoksi » 01 июл 2013, 02:14

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

Аватара пользователя
avshelestov
Сообщения: 61
Зарегистрирован: 31 окт 2012, 18:51

Re: Alarm manager & Notification

Сообщение avshelestov » 01 июл 2013, 07:04

Спасибо. Попробую.

Аватара пользователя
avshelestov
Сообщения: 61
Зарегистрирован: 31 окт 2012, 18:51

Re: Alarm manager & Notification

Сообщение avshelestov » 01 июл 2013, 17:10

К сожалению мне этот вариант совсем не подходит.
Мне нужно вызывать alarmmanager каждые сутки в установленное пользователем время.
А тут как я понял устнанавливается время с последней загрузки и интервал.

Аватара пользователя
avshelestov
Сообщения: 61
Зарегистрирован: 31 окт 2012, 18:51

Re: Alarm manager & Notification

Сообщение avshelestov » 01 июл 2013, 19:48

Вопрос решен.
Поставил условие и забыл позже удалить. :-)

Аватара пользователя
mitra
Сообщения: 10
Зарегистрирован: 18 ноя 2014, 11:22

Re: Alarm manager & Notification

Сообщение mitra » 08 мар 2015, 17:25

У меня вопрос. Чтобы запускать сервис в 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);
}
Каждая незаконченная задача - это минус. Но каждый зачеркнутый минус - это плюс.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Alarm manager & Notification

Сообщение doter.ua » 08 мар 2015, 18:31

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);
}
Не факт, он будет подстраиваться под другие алармы. лучше рекурсивно запускать одноразовые алармы.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

predeinay
Сообщения: 2
Зарегистрирован: 21 апр 2015, 21:33

Re: Alarm manager & Notification

Сообщение predeinay » 21 апр 2015, 21:38

Подскажите, что я делаю не так в простейшем примере,целый день мучаюсь.

Делаю вызов am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() +1000,1000, piIntent); по нажатию кнопки. В логах класса MyReceiver, который расширяет BroadcastReceiver, вывожу в лог информацию о том что вызывается метод onReceive.

При старте простейшего примера получаю в логах, что вызов onReceive срабатывает только один раз, а не каждую секунду как задано параметрами.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Alarm manager & Notification

Сообщение doter.ua » 21 апр 2015, 22:30

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."
В двух словах аларм не будет срабатывать четко по расписанию, а будет подстраиваться под другой ближайший аларм. Мутная штука для сбережения энергии. Кароч юзай рекурсивные одноразовые алармы, как в постах выше.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

predeinay
Сообщения: 2
Зарегистрирован: 21 апр 2015, 21:33

Re: Alarm manager & Notification

Сообщение predeinay » 22 апр 2015, 08:38

doter.ua писал(а):В двух словах аларм не будет срабатывать четко по расписанию, а будет подстраиваться под другой ближайший аларм. Мутная штука для сбережения энергии. Кароч юзай рекурсивные одноразовые алармы, как в постах выше.
т.е. использовать set за место setRepeating и в ресивере еще раз вызывать set и т.д. ?

Может я что то не понимаю, но нет ли более легко способа совершать запросы на сервер с андройда, на пример каждую минуту(!) для получения данных ?

есть требование, чтоб приложение на андройде (даже с выключенным экраном телефона) каждую минуту создавало запрос на сервер. Пробовал сделать через службы, но после выключения дисплея - запросы начинают проходить очень редко. Пробовал сделать WAKE_LOCK для службы, однако запросы все равно проходят не всегда.

Ответить