Pull to refresh

Программирование для 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):

<receiver android:name=".TimeNotification" />

Затем, идем в основной класс нашего приложения (допустим, 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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.