Google Android - это несложно • Просмотр темы - Урок 119. PendingIntent – флаги, requestCode. AlarmManager

Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 16 авг 2018, 17:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 18 июн 2014, 22:04 
Аватар пользователя

Зарегистрирован: 14 фев 2014, 09:42
Сообщений: 135
Благодарил (а): 25 раз.
Поблагодарили: 1 раз.
спасибо


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 авг 2014, 03:29 
Аватар пользователя

Зарегистрирован: 02 июл 2014, 00:21
Сообщений: 13
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Допустим, у меня есть некое множество будильников.Если мне нужно модифицировать/удалить какой-то элемент множества, при перезапуске приложения каждый раз придется инициализировать все Интенты?Или есть путь гораздо проще?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 авг 2014, 22:02 
Аватар пользователя

Зарегистрирован: 02 июл 2014, 00:21
Сообщений: 13
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Спасибо за оперативное молчание :D
С предыдущей проблемой я уже давно расправился.Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.

Код: [ Загрузить ] [ Скрыть ]
  1.      
  2.    public void setAlarm(long id, int h, int m, String eventName){ 
  3.         int time; 
  4.  
  5.         Intent intent = new Intent(this, OrganizerAlarm.class); 
  6.         intent.setAction(Integer.toString( (int) id)); 
  7.         intent.putExtra("event", eventName); 
  8.         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  9.  
  10.         PendingIntent pIntent = PendingIntent.getActivity(this, (int) id, intent, 0); 
  11.         Date date = new Date(System.currentTimeMillis()); 
  12.         //Далее вычисляется смещение по времени. Код опущу, дабы сэкономить пространство.... 
  13.         //....................... 
  14.         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis())+ time, 
  15.                 1000 * 60 * 5, pIntent); 
  16.      
  17.    } 


Как видно, использую RTC_WAKEUP, но эффекта не наблюдаю.На небольшом временном промежутке работает замечательно, не если устанавливать значительное смещение - несколько часов, не факт что сработает.Тестил на 24-х часовом промежутке.И еще вопрос - нажатие на кнопку выключения запускает режим сна?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 сен 2014, 20:38 
Аватар пользователя

Зарегистрирован: 12 дек 2013, 21:25
Сообщений: 67
Благодарил (а): 8 раз.
Поблагодарили: 16 раз.
Скажите можно ли использовать AlarmManager для реализации переключения режимов настроек (звук, смс, wi-fi, bluetooth и т.д.) ?

На примере архитектура примерно следующая Activity - AlarmManager - Service:
Главная активити создает и инициализирует все интенты режимов и их PendingIntents и передает их в AlarmManager.
AlarmManager по расписанию запускает эти PendingIntents.
PendingIntents в свою очередь запускают сервис.
В сервисе и происходит смена настроек.


Или может есть какой-то более простой путь?

_________________
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 фев 2015, 14:50 
Аватар пользователя

Зарегистрирован: 07 дек 2013, 22:07
Сообщений: 182
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Пытаюсь осуществить запуск сервиса по расписанию. Делаю это через вызов такого метода:
Код: [ Загрузить ] [ Скрыть ]
  1. public void setNotifySchedule() { 
  2.  
  3.         Intent Intent = new Intent(getApplicationContext(), NotificationService.class); 
  4.         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
  5.         PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, Intent, 0); 
  6.  
  7.         Calendar calendar = Calendar.getInstance(); 
  8.         calendar.set(Calendar.HOUR_OF_DAY, 12); 
  9.         calendar.set(Calendar.MINUTE, 00); 
  10.         calendar.set(Calendar.SECOND, 00); 
  11.  
  12.         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 24 * 60 * 60 * 1000, pendingIntent);  //set repeating every 24 hours 
  13.  
  14.     } 


Все работает, сервис запускается по расписанию.

Проблема в том, что каждый раз, когда вызывается этот метод, сервис тоже запускается. Видимо, PendingIntent не только создается, но и отправляется.

А как сделать так, чтобы он срабатывал только по расписанию?

_________________
Arbeit macht Fry


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 фев 2015, 15:07 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
Думаю проблема кроется тут:
Цитата:
Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.


т.к. ваша calendar.getTimeInMillis() может быть меньше System.currentTimeMillis(), и если это так, то следует календарь перевести на 1 день вперед.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 фев 2015, 15:32 
Аватар пользователя

Зарегистрирован: 07 дек 2013, 22:07
Сообщений: 182
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Но в моем случае будильник должен срабатывать каждый день. Как он может быть просрочен?

Цитата:
Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.


А этим поведением можно управлять? Нельзя сделать так, что если просрочен, просто не срабатывал бы.

_________________
Arbeit macht Fry


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2015, 07:42 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
Fry писал(а):
Но в моем случае будильник должен срабатывать каждый день. Как он может быть просрочен?

Цитата:
Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.


А этим поведением можно управлять? Нельзя сделать так, что если просрочен, просто не срабатывал бы.


То что он повторяется не имеет значение. Первое срабатывание просрочено и он срабатывает сразу.
Управлять скорее всего нельзя, решение я написал выше.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2015, 14:13 
Аватар пользователя

Зарегистрирован: 07 дек 2013, 22:07
Сообщений: 182
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.
Код: [ Загрузить ] [ Скрыть ]
  1.      calendar.add(Calendar.DATE, 1); 


Есть еще несколько вопросов по AlarmManager.

1. Вот добавляются разными приложениями задачи для AlarmManager, в том числе повторяющиеся... А отменяется ли конкретная задача после удаления приложеня? С учетом того, что задача может касаться работы не только компонентов этого приложения. И вообще, как отменяются будильники, если их явно не выключили через cansel?

2. В моем приложении нужно, чтобы раз в сутки совершалось определенное действие сервисом. Код метода, который это планирует, я в посте выше привел. А где лучше лучше вызывать этот метод?

Я его пока разместил в onCreate методе главного Активити, где он каждый раз вызывается. Это правильно? Или лучше делать проверку через SharedPrefensis на первый запуск приложения, и запускать, соответственно, только при первом запуске приложения?

_________________
Arbeit macht Fry


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2015, 15:20 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
Fry писал(а):
Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.
Код: [ Загрузить ] [ Скрыть ]
  1.      calendar.add(Calendar.DATE, 1); 


Есть еще несколько вопросов по AlarmManager.

1. Вот добавляются разными приложениями задачи для AlarmManager, в том числе повторяющиеся... А отменяется ли конкретная задача после удаления приложеня? С учетом того, что задача может касаться работы не только компонентов этого приложения. И вообще, как отменяются будильники, если их явно не выключили через cansel?

2. В моем приложении нужно, чтобы раз в сутки совершалось определенное действие сервисом. Код метода, который это планирует, я в посте выше привел. А где лучше лучше вызывать этот метод?

Я его пока разместил в onCreate методе главного Активити, где он каждый раз вызывается. Это правильно? Или лучше делать проверку через SharedPrefensis на первый запуск приложения, и запускать, соответственно, только при первом запуске приложения?


0. да именно эта строчка кода, только не забудьте, что она должна срабатывать только когда выполняется условие:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (calendar.getTimeInMillis() < System.currentTimeMillis())
  2.         calendar.add(Calendar.DATE, 1);


1. Тут особо не подскажу. При удалении приложения будильники скорее всего удаляться вместе с ним. Но это лишь предположение, но его не сложно проверить. Все будильники точно удалятся при перезагрузки устройства, но это уже другая история... (см 2)

2. Возможно при включении устройства стоит восстановить будильники, для этого стоит воспользоваться поиском "android.intent.action.BOOT_COMPLETED", и на форуме эта тема поднималась. По поводу создания в onCreate думаю в этом нет ничего плохого, операция не трудоемкая, в то время как логика с проверкой установлены будильники или нет может оказаться затратнее.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 фев 2015, 17:51 
Аватар пользователя

Зарегистрирован: 12 ноя 2013, 19:19
Сообщений: 22
Благодарил (а): 9 раз.
Поблагодарили: 1 раз.
Don77 писал(а):
Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.

Тоже интересует вопрос по данной теме. В ресивер вообще ничего не приходит.
И логи отловить не могу из-за большого промежутка. В программе пишет будильник активен.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 фев 2015, 20:09 
Аватар пользователя

Зарегистрирован: 07 дек 2013, 22:07
Сообщений: 182
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
klblk писал(а):
0. да именно эта строчка кода, только не забудьте, что она должна срабатывать только когда выполняется условие:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (calendar.getTimeInMillis() < System.currentTimeMillis())
  2.         calendar.add(Calendar.DATE, 1);


Спасибо, улучшу свой код.


klblk писал(а):
2. Возможно при включении устройства стоит восстановить будильники, для этого стоит воспользоваться поиском "android.intent.action.BOOT_COMPLETED", и на форуме эта тема поднималась.


Вы имеете в виду, что можно настроить на автозагрузку сервис, который будет устанавливать работу будильника? Или есть какой-то хитрый способ настроить как аndroid.intent.action.BOOT_COMPLETED сам AlarmManager?

_________________
Arbeit macht Fry


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 фев 2015, 07:13 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
Fry писал(а):
Вы имеете в виду, что можно настроить на автозагрузку сервис, который будет устанавливать работу будильника? Или есть какой-то хитрый способ настроить как аndroid.intent.action.BOOT_COMPLETED сам AlarmManager?


Не сервис, а receiver. В уроке 100 в самом конце показало как это делается. Там в теле ресивера запускается сервис, в вашем случае можно восстанавливать будильники.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 фев 2015, 15:10 
Аватар пользователя

Зарегистрирован: 07 дек 2013, 22:07
Сообщений: 182
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Да, я это и имел в виду - запуск сервиса через BR, как раз смотрел на пример из 100-го урока :)

Еще раз, спасибо.

_________________
Arbeit macht Fry


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 фев 2015, 12:44 
Аватар пользователя

Зарегистрирован: 12 ноя 2013, 19:19
Сообщений: 22
Благодарил (а): 9 раз.
Поблагодарили: 1 раз.
Разобрался с пропуском Alarm. SDK работает железно. Надо использовать соотв. API : "set" или "setExact".
Параметры те же, для компилятора ставим метку "@TargetApi" если SDK включает КК. Привожу свой код без правки.
Перегрузку функции не пробовал. Скорее всего не заработает. Вот и все.

Код: [ Загрузить ] [ Скрыть ]
  1.   @TargetApi(Build.VERSION_CODES.KITKAT) 
  2.     public void setScheduleAlarm(int idMsg, Calendar pCalendar, int pConfTime) 
  3.     { 
  4.         Intent intent = new Intent(mContext, AlarmReceiver.class).putExtra("MSG_ID", idMsg); 
  5.         PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, idMsg, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
  6.  
  7.         AlarmManager tAM = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 
  8.  
  9.         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) 
  10.         { 
  11.             if (AppPreffence.DEBUG) Log.i(AppPreffence.mylog, getClass().getSimpleName() + ": "+ String.valueOf(Build.VERSION.SDK_INT) +" SDK, Use prev set"); 
  12.             tAM.set(AlarmManager.RTC_WAKEUP, pCalendar.getTimeInMillis() - 1000 * (60 * pConfTime), pendingIntent); 
  13.         } 
  14.         else 
  15.         { 
  16.             if (AppPreffence.DEBUG) Log.i(AppPreffence.mylog, getClass().getSimpleName() + ": >19 SDK, Use KK setExact"); 
  17.             tAM.setExact(AlarmManager.RTC_WAKEUP, pCalendar.getTimeInMillis() - 1000 * (60 * pConfTime), pendingIntent); 
  18.         } 
  19.     } 


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 апр 2015, 13:24 

Зарегистрирован: 31 мар 2015, 15:17
Сообщений: 15
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
При нажатии на увидомления никакая информация в лог не выводится. Где мы прописываем, что при нажатии на уведомление запускается Receiver?

-----
Мда, забыл прописать в манифесте :lol:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 июн 2015, 12:56 

Зарегистрирован: 03 сен 2014, 21:12
Сообщений: 15
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
А кто как решает задачу, когда время выполнения сервиса возможно будет больше чем периодичность вызова этого сервиса в alarmManager.setRepeating ? Ну например, alarmManager.setRepeating для проверки почты задан каждую минуту, а загрузка этой самой почты затянулась, и длилась скажем аж 4 минуты. Проверка в самом сервисе на то, что он уже запущен, это понятно. Но вот проблема в том, что за эти 4 минуты alarmManager все равно успел поставить в очередь еще 4 сервиса, которые все равно запустятся, когда первый отработает. А это как то не очень :) Пока решил вопрос не через alarmManager.setRepeating, а alarmManager.set, и вызов самого себя в сервисе после того как отработала тяжелая длительная часть, но так не очень нравится, потому что если вдруг в процессе выполнения сервиса возникнет ошибка, и он вывалится, то alarmManager.set в нем самом может и не выполнится, и последующих запусков уже не будет. Можно конечно сделать еще одну периодическую проверку уже через alarmManager.setRepeating именно на проверку успешной отработки сервиса, но чета мне кажется это как то... Наверняка должно же быть более элегантное решение? Кто как решает?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 июн 2015, 13:59 

Зарегистрирован: 23 июл 2012, 23:11
Сообщений: 73
Благодарил (а): 0 раз.
Поблагодарили: 18 раз.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public boolean isServiceAlarmOn(Context context) {
  2.         Intent i = new Intent(context, YourService.class);
  3.         PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_NO_CREATE);
  4.         return pi != null;
  5.     }


Если isServiceAlarmOn() вернет true, значит сигнал установлен и ставить службу в очередь на выполнение нет необходимости


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 июн 2015, 20:38 

Зарегистрирован: 03 сен 2014, 21:12
Сообщений: 15
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Логично. Только как это поможет в моем случае с alarmManager.setRepeating ? :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 июн 2015, 16:32 

Зарегистрирован: 03 сен 2014, 21:12
Сообщений: 15
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Что, неужели ни у кого не возникало такой необходимости / проблемы?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 78 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB