Страница 3 из 5

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

Добавлено: 18 июн 2014, 22:04
n0tb0dy
спасибо

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

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

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

Добавлено: 25 авг 2014, 22:02
Don77
Спасибо за оперативное молчание :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-х часовом промежутке.И еще вопрос - нажатие на кнопку выключения запускает режим сна?

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

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

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


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

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

Добавлено: 06 фев 2015, 14:50
Fry
Пытаюсь осуществить запуск сервиса по расписанию. Делаю это через вызов такого метода:

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

 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 не только создается, но и отправляется.

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

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

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

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

Добавлено: 06 фев 2015, 15:32
Fry
Но в моем случае будильник должен срабатывать каждый день. Как он может быть просрочен?
Если вы запланируете будильник с просроченным временем запуска – он выполнится сразу же.
А этим поведением можно управлять? Нельзя сделать так, что если просрочен, просто не срабатывал бы.

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

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

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

Добавлено: 09 фев 2015, 14:13
Fry
Понятно, спасибо. Указанное вами решение вроде бы работает. Добавил день так.

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

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

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

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

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

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

Добавлено: 09 фев 2015, 15:20
klblk
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 думаю в этом нет ничего плохого, операция не трудоемкая, в то время как логика с проверкой установлены будильники или нет может оказаться затратнее.

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

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

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

Добавлено: 10 фев 2015, 20:09
Fry
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?

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

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

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

Добавлено: 11 фев 2015, 15:10
Fry
Да, я это и имел в виду - запуск сервиса через BR, как раз смотрел на пример из 100-го урока :)

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

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

Добавлено: 17 фев 2015, 12:44
Nialon
Разобрался с пропуском 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);
        }
    }

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

Добавлено: 26 апр 2015, 13:24
Pavel-Pugach
При нажатии на увидомления никакая информация в лог не выводится. Где мы прописываем, что при нажатии на уведомление запускается Receiver?

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

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

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

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

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

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

Добавлено: 15 июн 2015, 20:38
dmitry_stas
Логично. Только как это поможет в моем случае с alarmManager.setRepeating ? :)

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

Добавлено: 16 июн 2015, 16:32
dmitry_stas
Что, неужели ни у кого не возникало такой необходимости / проблемы?