Уведомления в строке состояния
Вступление
Кроме Toast-уведомлений, существует также другой тип уведомлений, который выводится в системной строке состояния в виде значка. Если открыть окно уведомлений, то можно увидеть расширенную текстовую информацию об уведомлении.
Когда пользователь открывает расширенное сообщение, Android запускает объект Intent, который определен в соответствии с уведомлением. Можно также конфигурировать уведомление с добавлением звука, вибрации и мигающих индикаторов на мобильном устройстве.
Этот вид уведомления удобен в том случае, когда приложение работает в фоновом режиме и должно уведомить пользователя о каком-либо важном событии. Уведомление будет висеть до тех пор, пока пользователь не отреагирует на него, в отличие от Toast-сообщения, которое исчезнет через несколько секунд. Фоновое приложение создает уведомление в строке состояния, но не запускает деятельность самостоятельно для получения пользовательского взаимодействия. Это должен делать только сам пользователь в удобное ему время.
Теория
Чтобы создать уведомление в строке состояния, необходимо использовать два класса:
- Notification — определяем свойства уведомления строки состояния: значок, расширенное сообщение и дополнительные параметры настройки (звук и др.);
- NotificationManager — системный сервис Android, который управляет всеми уведомлениями. Экземпляр NotificationManager создается при помощи вызова метода getSystemService(), а затем, когда надо показать уведомление пользователю, вызывается метод notify().
Практика
Ниже представлена последовательность действий для создания уведомления.
При создании уведомления сначала надо получить ссылку на NotificationManager через вызов метода getSystemService(), передав ему в качестве параметра строковую константу NOTIFICATION_SERVICE, определенную в классе Context:
private NotificationManager mNotifyMgr;
mNotifyMgr = (NotificationManager)getSystemService(
Context.NOTIFICATION_SERVICE);
Затем нужно создать значок, текст уведомления и объект Notification:
int icon = R.drawable.icon;
CharSequence tickerText = "Последнее китайское предупреждение!";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
После чего определить расширенное сообщение для уведомления:
CharSequence contentTitle = "Напоминание";
CharSequence contentText = "Накорми кота!";
Далее нужно создать объект Intent:
Intent notificationIntent = new Intent(
this, NotificationDemoActivity.class);
Затем создать объект PendingIntent, который описывает намерения и целевые действия. Он запустится, когда пользователь среагирует на уведомление:
PendingIntent contentIntent = PendingIntent.getActivity(
this, 0, notificationIntent, 0);
Объект PendingIntent создается методом getActivity(), который принимает четыре параметра:
- контекст приложения, в котором объект PendingIntent должен запустить деятельность;
- код запроса для отправителя (не используется, передается значение 0);
- созданный ранее объект Intent;
- константа для управления намерением
Затем для объекта Notification с помощью метода setLatestEventInfo() создать представление, которое будет показано в расширенной строке состояния:
notification.setLatestEventInfo(context, contentTitle,
contentText, contentIntent);
Наконец, надо передать объект Notification в объект NotificationManager в качестве параметра для метода notify():
mNotificationManager.notify(NOTIFY_ID, notification);
NOTIFY_ID — это идентификатор уведомления, определяемый в вашем классе для работы с уведомлением.
На мой взгляд, все очень запутанно и сложно для запоминания. Без поллитра молока не разберешься.
Для демонстрации примера поместите на форму кнопку и напишите следующий код:
package ru.alexanderklimov.notification;
import ... // здесь все необходимые import
public class NotificationDemoActivity extends Activity
implements View.OnClickListener
{
private Button mButton;
private static final int NOTIFY_ID = 101;
private NotificationManager mNotifyMgr;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mNotifyMgr = (NotificationManager)getSystemService(
Context.NOTIFICATION_SERVICE);
mButton = (Button)findViewById(R.id.button1);
mButton.setOnClickListener(this);
}
public void onClick(View view)
{
int icon = R.drawable.icon;
CharSequence tickerText = "Последнее китайское предупреждение!";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Context context = getApplicationContext();
CharSequence contentTitle = "Напоминание";
CharSequence contentText = "Накорми кота!";
Intent notificationIntent = new Intent(
this, NotificationDemoActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(
this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle,
contentText, contentIntent);
mNotifyMgr.notify(NOTIFY_ID, notification);
}
}
Запустите проект на выполнение. При нажатии кнопки вызова уведомления в строке состояния на короткий промежуток времени должен отобразиться значок и текст уведомления.
Через какое-то время текст уведомления исчезнет, а останется только значок. Вы можете закрыть приложение. Значок по-прежнему будет виден в строке состояния. Нажмите на значок, и удерживая его, потяните его вниз, чтобы открыть специальное окно уведомлений. Вы увидите расширенное уведомление.
Вы можете нажать на кнопку Очистить, чтобы удалить данное уведомление. Если вы нажмете на само уведомление, то снова запустится наше приложение.
Создание собственных уведомлений для строки состояния
Если простого текстового сообщения недостаточно для уведомления пользователя приложения или вам хочется создать оригинальный дизайн для режима развернутого уведомления, можно создать собственный дизайн разметки развернутого уведомления. По умолчанию расширенное представление, используемое в окне Notiflcations, включает основной заголовок и текстовое сообщение. Они определяются в методе setLatestEventinfo() двумя параметрами:
- contentTitie — заголовок уведомления
- contentText — текст уведомления.
Однако вы можете также определить вашу собственную схему разметки для расширенного сообщения, создав экземпляр класса RemoteViews и передав его в ContentView уведомления:
RemoteViews contentView new RemoteViews(
getPackageName(), R.layout.custom_layout);
contentView.setImageViewResource(R.id.image, R.drawable.android3d);
contentView.setTextViewText(R.id.text, text);
Notification notification = new Notification(icon, tickerText, when);
notification.contentIntent = contentIntent;
notification.contentView = contentView;
mNotifyMgr.notify(NOTIFY_ID, notification);

