Статьи

Android SDK: использование оповещений, тостов и уведомлений

Если у вас есть устройство на платформе Android, то вы уже испытывали различные типы уведомлений. Они хороши для того, чтобы сообщать пользователям об ошибках, предупреждениях или информировать их о выполненных задачах, и лучше всего размещать их в виде уведомлений, таких как диалоговое окно предупреждений, которое позволяет вам общаться с пользователями «за пределами» пользовательских интерфейсов.

Android SDK предлагает три основных типа уведомлений — достаточно для удовлетворения всех ваших потребностей:

  • Оповещения Диалоги
  • Тосты
  • Уведомления

В этом уроке мы рассмотрим все три типа уведомлений.

Создание диалоговых окон предупреждений довольно просто: вы можете создать AlertDialog, используя его класс Builder, все методы которого возвращают экземпляр Builder, что, в основном, означает, что вы можете объединять серии вызовов методов вместе. Например:

1
new AlertDialog.Builder(this).setTitle(«Argh»).setMessage(«Watch out!»).setNeutralButton(«Close», null).show();
Android-SDK-уведомление

В приведенном выше фрагменте вы получаете доступ к статическому классу Builder AlertDialog и передаете ему контекст, в котором будет отображаться диалоговое окно.

setNeutralButton (String, OnClickListener) создает кнопку с указанным заголовком и OnClickListener для обработки всего, что должно происходить при щелчке. Вы можете просто присвоить ему значение null, потому что кнопки AlertDialog всегда закрываются при нажатии; ваш OnClickListener будет просто обрабатывать дополнительные, пользовательские инструкции.

Теперь вы, наверное, задаетесь вопросом, почему слово «нейтральный» содержится в названии этого метода, верно? Всего можно создать три типа кнопок:

  1. setPositiveButton

    Описывает предполагаемое действие или подтверждение, например, «Сохранить» или «Да».

  2. setNeutralButton

    Описывает «нейтральное» действие, например «Закрыть».

  3. setNegativeButton

    Описывает отмену или просто «Нет».

Важно отметить, что если вы добавите все три из этих кнопок, они будут в том же порядке, что и в приведенном выше списке, поэтому иногда вам может потребоваться переключить «нейтральный» и «отрицательный» для достижения желаемого порядка. Итак, следующий фрагмент:

1
new AlertDialog.Builder(this).setTitle(«Argh»).setMessage(«Watch out!»).setNegativeButton(«Cancel», null).setPositiveButton(«OK», null).setNeutralButton(«No», null).show();

Будет производить это предупреждение:

Android-SDK-уведомление

И всегда не забывайте создавать хотя бы одну кнопку, чтобы ваш диалог можно было закрыть, иначе вы будете разочарованы пользователями, увидевшими это:

Android-SDK-уведомление

Наконец, еще один популярный метод — setIcon (int resourceId) . Это должно быть само за себя:

1
new AlertDialog.Builder(this).setTitle(«Argh»).setMessage(«Watch out!»).setIcon(R.drawable.icon).setNeutralButton(«Close», null).show();
Android-SDK-уведомление

Примечание: наиболее важные методы были рассмотрены здесь. Полный список методов построения можно найти в документации по API .

Тосты — отличный способ доставлять пользователям ненавязчивые сообщения о статусе, потому что в отличие от диалоговых окон предупреждений они не отвлекают внимание от действия. Они идеально подходят для отображения уведомлений, которые не требуют слишком большого внимания, например, чтобы сообщить пользователю, что загрузка завершена. Поскольку тосты исчезают автоматически и являются довольно тонкими по своей природе, возможно, не гарантируется, что пользователь полностью их заметит. Итак, простым языком: не используйте тосты для критических сообщений!

Одна простая строка кода — это все, что требуется для создания Toast:

1
Toast.makeText(this, «Your download has resumed.», Toast.LENGTH_LONG).show();

Опять же, первый параметр определяет контекст, в котором он отображается. Второе — это тело сообщения, а последний аргумент указывает, как долго тост должен оставаться на экране. Только Toast.LENGTH_LONG или Toast.LENGTH_SHORT являются допустимыми значениями — вы не можете указать это время в секундах, так как продолжительность обрабатывается на относительной основе, поэтому она может зависеть от конфигурации пользователя.

Android-SDK-уведомление

Уведомления — это сообщения в строке состояния в верхней части экрана. Они удобны для таких вещей, как уведомление пользователя о новой непрочитанной электронной почте в фоновом режиме, даже если он в данный момент не находится внутри приложения электронной почты (именно это делает приложение GMail). Ниже приведен код, необходимый для отображения уведомления:

01
02
03
04
05
06
07
08
09
10
11
final int NOTIF_ID = 1234;
 
 NotificationManager notifManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 Notification note = new Notification(R.drawable.icon, «New E-mail», System.currentTimeMillis());
 
 PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, Main.class), 0);
 
 note.setLatestEventInfo(this, «New E-mail», «You have one unread message.», intent);
 
 notifManager.notify(NOTIF_ID, note);
 // notifManager.cancel(NOTIF_ID);

Давайте рассмотрим этот большой блок кода по частям. Во-первых, вам нужно получить экземпляр NotificationManager устройства, системной службы.

1
NotificationManager notifManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

NotificationManager может отправлять — как вы уже догадались — объекты уведомлений. Создайте новый экземпляр такого как:

1
Notification note = new Notification(R.drawable.icon, «New E-mail», System.currentTimeMillis());

Первый параметр — это идентификатор ресурса Drawable (в данном случае я просто использовал фиктивный значок приложения, который был создан автоматически). Второй — это сокращенный заголовок, который будет отображаться в верхней строке состояния, а не тот, который вы видите при расширении панели. Наконец, последний параметр — это время, которое будет отображаться в деталях уведомления.

Затем вы создадите объект PendingIntent, чтобы указать, что должно произойти при нажатии на уведомление. Обычно вы хотите запустить действие в вашем приложении через Intent:

1
PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);

Первый аргумент — это контекст, второй — это закрытый код запроса (пока не беспокойтесь о нем; в соответствии с документацией по Android он не используется), третий — объект Intent (в данном случае мы запускаем его). MainActivity) и последний предназначен для флагов (см. документацию SDK для объяснения этих флагов).

Теперь начинается сочная часть. Используя setLatestEventInfo, вы можете указать заголовок, сообщение и намерение, которые будут вызываться, когда пользователи нажимают на уведомление в расширенном представлении.

1
note.setLatestEventInfo(this, «New E-mail», «You have one unread message.», intent);

Все, что осталось сделать, это создать константу int для хранения идентификатора, чтобы вы могли отслеживать уведомления. Вам нужно выбрать значение для него — просто убедитесь, что вы не используете дубликаты. Вызовите notify () и передайте идентификатор вместе с объектом Notification, который вы создали ранее:

1
2
final int NOTIF_ID = 1234;
notifManager.notify(NOTIF_ID, note);
Android-SDK-уведомление

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

1
notifManager.cancel(NOTIF_ID);