Alarmmanager как сделать несколько уведомлений
Перейти к содержимому

Alarmmanager как сделать несколько уведомлений

Программирование для Android: уведомления с использованием AlarmManager

Многим обладателям телефонов с Android, владеющим элементарными навыками программирования, хотелось или захочется написать свою «программку для телефона». Учитывая рост популярности этой ОС и факт существования Android Market, эта идея может еще и денег принести.
Особенность Android в том, что ребята из Google дают разработчику разрешение использовать все (вернее, почти все) возможности телефона. Можно перехватывать звонки, рассылать SMS, и многое другое. Одна из полезных вещей — уведомления, появляющиеся в соответствующей области вверху экрана. В этом посте я расскажу, как легко и просто их организовать.

Итак, ставим задачу: в определенное время, ежедневно, уведомлять пользователя о необходимости запустить приложение и что-то в нем сделать. Ну и совсем здорово, если по нажатию на уведомление запустится нужное приложение.

Нам понадобятся следующие классы:
AlarmManager — собственно, эта штука и умеет генерировать системные события по заданым параметрам
BroadcastReceiver — для обработки событий AlarmManager
NotificationManager — а эта штука умеет показывать уведомления

Первым делом, создадим класс — приемник:

public class TimeNotification extends BroadcastReceiver @Override
public void onReceive(Context context, Intent intent) // Этот метод будет вызываться по событию, сочиним его позже
>
>

Обязательно следует упомянуть об этом в манифесте (в разделе application):

Затем, идем в основной класс нашего приложения (допустим, MainActivity). Здесь нам необходимо обеспечить функционал по запуску и настройке AlarmManager.
Предположим, что задачу установки пользователем настроек мы уже решили, и у нас есть глобальная переменная stamp, в которой хранится время следующего показа уведомления.

private void restartNotify() am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, TimeNotification.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT );
// На случай, если мы ранее запускали активити, а потом поменяли время,
// откажемся от уведомления
am.cancel(pendingIntent);
// Устанавливаем разовое напоминание
am.set(AlarmManager.RTC_WAKEUP, stamp.getTime(), pendingIntent);
>

Почему разовое, спросите вы? У AlarmManager есть метод setRepeat, где можно задать интервал. Но мне кажется, проще перезапустить процесс при обработке события, на случай смены настроек и т.п. Хотя, это личное дело каждого, оба варианта будут работать.

Ну и, собственно, реализуем обработчик

public void onReceive(Context context, Intent intent) nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon, «Test», System.currentTimeMillis());
//Интент для активити, которую мы хотим запускать при нажатии на уведомление
Intent intentTL = new Intent(context, MainActivity.class);
notification.setLatestEventInfo(context, «Test», «Do something!»,
PendingIntent.getActivity(context, 0, intentTL,
PendingIntent.FLAG_CANCEL_CURRENT));
notification.flags = Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL;
nm.notify(1, notification);
// Установим следующее напоминание.
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_DAY, pendingIntent);
>

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

How to set multiple alarms using alarm manager in android

I’m building an alarm application. I have successfully implemented basic alarm functions.

In my application, user can select days (sunday,monday. ) to repeat the alarm weekly. I’m trying to create multiple alarms to repeat weekly but don’t know how to do it. Can I create it using (repeat) interval or should I create multiple alarm managers?

user avatar

7 Answers 7

You need to use different Broadcast id’s for the pending intents . Something like this:

Using the system time should be a unique identifier for every pending intent you fire.

If there is already an alarm for this Intent scheduled (with the equality of two intents being defined by filterEquals(Intent), then it will be removed and replaced by this one

Multiple AlarmManagers would not resolve your issue. If they have multiple different alarms (different times and different days), then you would need to set the alarm within the BroadcastReceiver every time you fire off a previous alarm.

You would also need to hold RECEIVE_BOOT_COMPLETED and have a BroadcastReceiver to receive the boot so that if the phone is rebooted you can re-schedule your alarms.

как связать несколько AlarmManager с разными уведомлениями в OnReceive?

Я хочу запускать разные уведомления при достижении определенного AlarmManager.

Например, я хочу отображать «день независимости», когда мы достигаем даты независимости, хранящейся в определенном диспетчере аварийных сигналов, и отображать «Стив Джобс умер», когда мы достигаем даты его смерти, хранящейся в другом диспетчере аварийных сигналов, и так далее.

Итак, мой вопрос: как связать каждый AlarmManager (cal и cal2) с разными уведомлениями?

Я делал это до сих пор,

Обратите внимание, что я сделал дат для активации уведомления, и оно работает, уведомление в onReceive было запущено дважды, в первый раз, когда я достиг «cal», и во второй раз, когда я достиг «cal2». Но, как я уже упоминал выше, мне нужно запустить другое уведомление, когда я достигну cal2.

После применения того, что упомянуто ниже: я сделал эти 4 события:

Иногда при первом запуске приложения все события появляются, иногда 3-е появляются дважды, а первые два не появляются, иногда появляется только последнее, так что в моем коде что-то не так или беспорядочно, в чем проблема?

Добавить комментарий

Ваш адрес email не будет опубликован.