Урок 119. PendingIntent – флаги, requestCode. AlarmManager
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Допустим, у меня есть некое множество будильников.Если мне нужно модифицировать/удалить какой-то элемент множества, при перезапуске приложения каждый раз придется инициализировать все Интенты?Или есть путь гораздо проще?
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Спасибо за оперативное молчание
С предыдущей проблемой я уже давно расправился.Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.
Как видно, использую RTC_WAKEUP, но эффекта не наблюдаю.На небольшом временном промежутке работает замечательно, не если устанавливать значительное смещение - несколько часов, не факт что сработает.Тестил на 24-х часовом промежутке.И еще вопрос - нажатие на кнопку выключения запускает режим сна?
С предыдущей проблемой я уже давно расправился.Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.
Код: Выделить всё
public void setAlarm(long id, int h, int m, String eventName){
int time;
Intent intent = new Intent(this, OrganizerAlarm.class);
intent.setAction(Integer.toString( (int) id));
intent.putExtra("event", eventName);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntent = PendingIntent.getActivity(this, (int) id, intent, 0);
Date date = new Date(System.currentTimeMillis());
//Далее вычисляется смещение по времени. Код опущу, дабы сэкономить пространство....
//.......................
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis())+ time,
1000 * 60 * 5, pIntent);
}
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Скажите можно ли использовать AlarmManager для реализации переключения режимов настроек (звук, смс, wi-fi, bluetooth и т.д.) ?
На примере архитектура примерно следующая Activity - AlarmManager - Service:
Главная активити создает и инициализирует все интенты режимов и их PendingIntents и передает их в AlarmManager.
AlarmManager по расписанию запускает эти PendingIntents.
PendingIntents в свою очередь запускают сервис.
В сервисе и происходит смена настроек.
Или может есть какой-то более простой путь?
На примере архитектура примерно следующая Activity - AlarmManager - Service:
Главная активити создает и инициализирует все интенты режимов и их PendingIntents и передает их в AlarmManager.
AlarmManager по расписанию запускает эти PendingIntents.
PendingIntents в свою очередь запускают сервис.
В сервисе и происходит смена настроек.
Или может есть какой-то более простой путь?
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма
Телепрограмма в твоем смарте Телепрограмма
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Пытаюсь осуществить запуск сервиса по расписанию. Делаю это через вызов такого метода:
Все работает, сервис запускается по расписанию.
Проблема в том, что каждый раз, когда вызывается этот метод, сервис тоже запускается. Видимо, PendingIntent не только создается, но и отправляется.
А как сделать так, чтобы он срабатывал только по расписанию?
Код: Выделить всё
public void setNotifySchedule() {
Intent Intent = new Intent(getApplicationContext(), NotificationService.class);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, Intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 00);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24 * 60 * 60 * 1000, pendingIntent); //set repeating every 24 hours
}
Проблема в том, что каждый раз, когда вызывается этот метод, сервис тоже запускается. Видимо, PendingIntent не только создается, но и отправляется.
А как сделать так, чтобы он срабатывал только по расписанию?
Arbeit macht Fry
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Думаю проблема кроется тут:
т.к. ваша calendar.getTimeInMillis() может быть меньше System.currentTimeMillis(), и если это так, то следует календарь перевести на 1 день вперед.Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Но в моем случае будильник должен срабатывать каждый день. Как он может быть просрочен?
А этим поведением можно управлять? Нельзя сделать так, что если просрочен, просто не срабатывал бы.Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.
Arbeit macht Fry
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
То что он повторяется не имеет значение. Первое срабатывание просрочено и он срабатывает сразу.Fry писал(а):Но в моем случае будильник должен срабатывать каждый день. Как он может быть просрочен?
А этим поведением можно управлять? Нельзя сделать так, что если просрочен, просто не срабатывал бы.Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.
Управлять скорее всего нельзя, решение я написал выше.
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.
Есть еще несколько вопросов по AlarmManager.
1. Вот добавляются разными приложениями задачи для AlarmManager, в том числе повторяющиеся... А отменяется ли конкретная задача после удаления приложеня? С учетом того, что задача может касаться работы не только компонентов этого приложения. И вообще, как отменяются будильники, если их явно не выключили через cansel?
2. В моем приложении нужно, чтобы раз в сутки совершалось определенное действие сервисом. Код метода, который это планирует, я в посте выше привел. А где лучше лучше вызывать этот метод?
Я его пока разместил в onCreate методе главного Активити, где он каждый раз вызывается. Это правильно? Или лучше делать проверку через SharedPrefensis на первый запуск приложения, и запускать, соответственно, только при первом запуске приложения?
Код: Выделить всё
calendar.add(Calendar.DATE, 1);
1. Вот добавляются разными приложениями задачи для AlarmManager, в том числе повторяющиеся... А отменяется ли конкретная задача после удаления приложеня? С учетом того, что задача может касаться работы не только компонентов этого приложения. И вообще, как отменяются будильники, если их явно не выключили через cansel?
2. В моем приложении нужно, чтобы раз в сутки совершалось определенное действие сервисом. Код метода, который это планирует, я в посте выше привел. А где лучше лучше вызывать этот метод?
Я его пока разместил в onCreate методе главного Активити, где он каждый раз вызывается. Это правильно? Или лучше делать проверку через SharedPrefensis на первый запуск приложения, и запускать, соответственно, только при первом запуске приложения?
Arbeit macht Fry
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
0. да именно эта строчка кода, только не забудьте, что она должна срабатывать только когда выполняется условие:Fry писал(а):Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.Есть еще несколько вопросов по AlarmManager.Код: Выделить всё
calendar.add(Calendar.DATE, 1);
1. Вот добавляются разными приложениями задачи для AlarmManager, в том числе повторяющиеся... А отменяется ли конкретная задача после удаления приложеня? С учетом того, что задача может касаться работы не только компонентов этого приложения. И вообще, как отменяются будильники, если их явно не выключили через cansel?
2. В моем приложении нужно, чтобы раз в сутки совершалось определенное действие сервисом. Код метода, который это планирует, я в посте выше привел. А где лучше лучше вызывать этот метод?
Я его пока разместил в onCreate методе главного Активити, где он каждый раз вызывается. Это правильно? Или лучше делать проверку через SharedPrefensis на первый запуск приложения, и запускать, соответственно, только при первом запуске приложения?
[syntax=java]if (calendar.getTimeInMillis() < System.currentTimeMillis())
calendar.add(Calendar.DATE, 1); [/syntax]
1. Тут особо не подскажу. При удалении приложения будильники скорее всего удаляться вместе с ним. Но это лишь предположение, но его не сложно проверить. Все будильники точно удалятся при перезагрузки устройства, но это уже другая история... (см 2)
2. Возможно при включении устройства стоит восстановить будильники, для этого стоит воспользоваться поиском "android.intent.action.BOOT_COMPLETED", и на форуме эта тема поднималась. По поводу создания в onCreate думаю в этом нет ничего плохого, операция не трудоемкая, в то время как логика с проверкой установлены будильники или нет может оказаться затратнее.
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Тоже интересует вопрос по данной теме. В ресивер вообще ничего не приходит.Don77 писал(а):Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.
И логи отловить не могу из-за большого промежутка. В программе пишет будильник активен.
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Спасибо, улучшу свой код.klblk писал(а): 0. да именно эта строчка кода, только не забудьте, что она должна срабатывать только когда выполняется условие:
[syntax=java]if (calendar.getTimeInMillis() < System.currentTimeMillis())
calendar.add(Calendar.DATE, 1); [/syntax]
Вы имеете в виду, что можно настроить на автозагрузку сервис, который будет устанавливать работу будильника? Или есть какой-то хитрый способ настроить как аndroid.intent.action.BOOT_COMPLETED сам AlarmManager?klblk писал(а): 2. Возможно при включении устройства стоит восстановить будильники, для этого стоит воспользоваться поиском "android.intent.action.BOOT_COMPLETED", и на форуме эта тема поднималась.
Arbeit macht Fry
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Не сервис, а receiver. В уроке 100 в самом конце показало как это делается. Там в теле ресивера запускается сервис, в вашем случае можно восстанавливать будильники.Fry писал(а):Вы имеете в виду, что можно настроить на автозагрузку сервис, который будет устанавливать работу будильника? Или есть какой-то хитрый способ настроить как аndroid.intent.action.BOOT_COMPLETED сам AlarmManager?
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Да, я это и имел в виду - запуск сервиса через BR, как раз смотрел на пример из 100-го урока
Еще раз, спасибо.
Еще раз, спасибо.
Arbeit macht Fry
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Разобрался с пропуском Alarm. SDK работает железно. Надо использовать соотв. API : "set" или "setExact".
Параметры те же, для компилятора ставим метку "@TargetApi" если SDK включает КК. Привожу свой код без правки.
Перегрузку функции не пробовал. Скорее всего не заработает. Вот и все.
Параметры те же, для компилятора ставим метку "@TargetApi" если SDK включает КК. Привожу свой код без правки.
Перегрузку функции не пробовал. Скорее всего не заработает. Вот и все.
Код: Выделить всё
@TargetApi(Build.VERSION_CODES.KITKAT)
public void setScheduleAlarm(int idMsg, Calendar pCalendar, int pConfTime)
{
Intent intent = new Intent(mContext, AlarmReceiver.class).putExtra("MSG_ID", idMsg);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, idMsg, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager tAM = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
{
if (AppPreffence.DEBUG) Log.i(AppPreffence.mylog, getClass().getSimpleName() + ": "+ String.valueOf(Build.VERSION.SDK_INT) +" SDK, Use prev set");
tAM.set(AlarmManager.RTC_WAKEUP, pCalendar.getTimeInMillis() - 1000 * (60 * pConfTime), pendingIntent);
}
else
{
if (AppPreffence.DEBUG) Log.i(AppPreffence.mylog, getClass().getSimpleName() + ": >19 SDK, Use KK setExact");
tAM.setExact(AlarmManager.RTC_WAKEUP, pCalendar.getTimeInMillis() - 1000 * (60 * pConfTime), pendingIntent);
}
}
-
- Сообщения: 15
- Зарегистрирован: 31 мар 2015, 15:17
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
При нажатии на увидомления никакая информация в лог не выводится. Где мы прописываем, что при нажатии на уведомление запускается Receiver?
-----
Мда, забыл прописать в манифесте
-----
Мда, забыл прописать в манифесте
-
- Сообщения: 15
- Зарегистрирован: 03 сен 2014, 21:12
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
А кто как решает задачу, когда время выполнения сервиса возможно будет больше чем периодичность вызова этого сервиса в alarmManager.setRepeating ? Ну например, alarmManager.setRepeating для проверки почты задан каждую минуту, а загрузка этой самой почты затянулась, и длилась скажем аж 4 минуты. Проверка в самом сервисе на то, что он уже запущен, это понятно. Но вот проблема в том, что за эти 4 минуты alarmManager все равно успел поставить в очередь еще 4 сервиса, которые все равно запустятся, когда первый отработает. А это как то не очень Пока решил вопрос не через alarmManager.setRepeating, а alarmManager.set, и вызов самого себя в сервисе после того как отработала тяжелая длительная часть, но так не очень нравится, потому что если вдруг в процессе выполнения сервиса возникнет ошибка, и он вывалится, то alarmManager.set в нем самом может и не выполнится, и последующих запусков уже не будет. Можно конечно сделать еще одну периодическую проверку уже через alarmManager.setRepeating именно на проверку успешной отработки сервиса, но чета мне кажется это как то... Наверняка должно же быть более элегантное решение? Кто как решает?
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
[syntax=java]public boolean isServiceAlarmOn(Context context) {
Intent i = new Intent(context, YourService.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_NO_CREATE);
return pi != null;
}[/syntax]
Если isServiceAlarmOn() вернет true, значит сигнал установлен и ставить службу в очередь на выполнение нет необходимости
Intent i = new Intent(context, YourService.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_NO_CREATE);
return pi != null;
}[/syntax]
Если isServiceAlarmOn() вернет true, значит сигнал установлен и ставить службу в очередь на выполнение нет необходимости
-
- Сообщения: 15
- Зарегистрирован: 03 сен 2014, 21:12
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Логично. Только как это поможет в моем случае с alarmManager.setRepeating ?
-
- Сообщения: 15
- Зарегистрирован: 03 сен 2014, 21:12
Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag
Что, неужели ни у кого не возникало такой необходимости / проблемы?