Урок 119. PendingIntent – флаги, requestCode. AlarmManager

Обсуждение уроков
Аватара пользователя
n0tb0dy
Сообщения: 135
Зарегистрирован: 14 фев 2014, 09:42

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение n0tb0dy » 18 июн 2014, 22:04

спасибо

Аватара пользователя
Don77
Сообщения: 13
Зарегистрирован: 02 июл 2014, 00:21

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Don77 » 09 авг 2014, 03:29

Допустим, у меня есть некое множество будильников.Если мне нужно модифицировать/удалить какой-то элемент множества, при перезапуске приложения каждый раз придется инициализировать все Интенты?Или есть путь гораздо проще?

Аватара пользователя
Don77
Сообщения: 13
Зарегистрирован: 02 июл 2014, 00:21

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Don77 » 25 авг 2014, 22:02

Спасибо за оперативное молчание :D
С предыдущей проблемой я уже давно расправился.Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.

Код: Выделить всё

    
   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);
    
   }
Как видно, использую RTC_WAKEUP, но эффекта не наблюдаю.На небольшом временном промежутке работает замечательно, не если устанавливать значительное смещение - несколько часов, не факт что сработает.Тестил на 24-х часовом промежутке.И еще вопрос - нажатие на кнопку выключения запускает режим сна?

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Leeroy » 14 сен 2014, 20:38

Скажите можно ли использовать AlarmManager для реализации переключения режимов настроек (звук, смс, wi-fi, bluetooth и т.д.) ?

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


Или может есть какой-то более простой путь?
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Fry » 06 фев 2015, 14:50

Пытаюсь осуществить запуск сервиса по расписанию. Делаю это через вызов такого метода:

Код: Выделить всё

 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

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение klblk » 06 фев 2015, 15:07

Думаю проблема кроется тут:
Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.
т.к. ваша calendar.getTimeInMillis() может быть меньше System.currentTimeMillis(), и если это так, то следует календарь перевести на 1 день вперед.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Fry » 06 фев 2015, 15:32

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

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение klblk » 09 фев 2015, 07:42

Fry писал(а):Но в моем случае будильник должен срабатывать каждый день. Как он может быть просрочен?
Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.
А этим поведением можно управлять? Нельзя сделать так, что если просрочен, просто не срабатывал бы.
То что он повторяется не имеет значение. Первое срабатывание просрочено и он срабатывает сразу.
Управлять скорее всего нельзя, решение я написал выше.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Fry » 09 фев 2015, 14:13

Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.

Код: Выделить всё

     calendar.add(Calendar.DATE, 1);
Есть еще несколько вопросов по AlarmManager.

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

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

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

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение klblk » 09 фев 2015, 15:20

Fry писал(а):Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.

Код: Выделить всё

     calendar.add(Calendar.DATE, 1);
Есть еще несколько вопросов по AlarmManager.

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

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

Я его пока разместил в onCreate методе главного Активити, где он каждый раз вызывается. Это правильно? Или лучше делать проверку через SharedPrefensis на первый запуск приложения, и запускать, соответственно, только при первом запуске приложения?
0. да именно эта строчка кода, только не забудьте, что она должна срабатывать только когда выполняется условие:
[syntax=java]if (calendar.getTimeInMillis() < System.currentTimeMillis())
calendar.add(Calendar.DATE, 1); [/syntax]

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

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

Аватара пользователя
Nialon
Сообщения: 22
Зарегистрирован: 12 ноя 2013, 19:19

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Nialon » 10 фев 2015, 17:51

Don77 писал(а):Возникла следующая - не всегда срабатывает будильник, а именно когда устройство в спящем режиме.
Тоже интересует вопрос по данной теме. В ресивер вообще ничего не приходит.
И логи отловить не могу из-за большого промежутка. В программе пишет будильник активен.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Fry » 10 фев 2015, 20:09

klblk писал(а): 0. да именно эта строчка кода, только не забудьте, что она должна срабатывать только когда выполняется условие:
[syntax=java]if (calendar.getTimeInMillis() < System.currentTimeMillis())
calendar.add(Calendar.DATE, 1); [/syntax]
Спасибо, улучшу свой код.

klblk писал(а): 2. Возможно при включении устройства стоит восстановить будильники, для этого стоит воспользоваться поиском "android.intent.action.BOOT_COMPLETED", и на форуме эта тема поднималась.
Вы имеете в виду, что можно настроить на автозагрузку сервис, который будет устанавливать работу будильника? Или есть какой-то хитрый способ настроить как аndroid.intent.action.BOOT_COMPLETED сам AlarmManager?
Arbeit macht Fry

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение klblk » 11 фев 2015, 07:13

Fry писал(а):Вы имеете в виду, что можно настроить на автозагрузку сервис, который будет устанавливать работу будильника? Или есть какой-то хитрый способ настроить как аndroid.intent.action.BOOT_COMPLETED сам AlarmManager?
Не сервис, а receiver. В уроке 100 в самом конце показало как это делается. Там в теле ресивера запускается сервис, в вашем случае можно восстанавливать будильники.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Fry » 11 фев 2015, 15:10

Да, я это и имел в виду - запуск сервиса через BR, как раз смотрел на пример из 100-го урока :)

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

Аватара пользователя
Nialon
Сообщения: 22
Зарегистрирован: 12 ноя 2013, 19:19

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Nialon » 17 фев 2015, 12:44

Разобрался с пропуском Alarm. SDK работает железно. Надо использовать соотв. API : "set" или "setExact".
Параметры те же, для компилятора ставим метку "@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);
        }
    }

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Pavel-Pugach » 26 апр 2015, 13:24

При нажатии на увидомления никакая информация в лог не выводится. Где мы прописываем, что при нажатии на уведомление запускается Receiver?

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

dmitry_stas
Сообщения: 15
Зарегистрирован: 03 сен 2014, 21:12

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение dmitry_stas » 15 июн 2015, 12:56

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

Dark67
Сообщения: 72
Зарегистрирован: 23 июл 2012, 23:11

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение Dark67 » 15 июн 2015, 13:59

[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, значит сигнал установлен и ставить службу в очередь на выполнение нет необходимости

dmitry_stas
Сообщения: 15
Зарегистрирован: 03 сен 2014, 21:12

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение dmitry_stas » 15 июн 2015, 20:38

Логично. Только как это поможет в моем случае с alarmManager.setRepeating ? :)

dmitry_stas
Сообщения: 15
Зарегистрирован: 03 сен 2014, 21:12

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Сообщение dmitry_stas » 16 июн 2015, 16:32

Что, неужели ни у кого не возникало такой необходимости / проблемы?

Ответить