Android Notifications. Сповіщення. Основи

Notifications - це сповіщення, які користувач бачить у верхній частині екрана, коли йому надходить новий лист, повідомлення, оновлення тощо.

У цьому уроці розглянемо основи - відображення/оновлення/видалення сповіщення та обробка натискання на нього.

Відображення

Код створення простого повідомлення має такий вигляд:

NotificationCompat.Builder builder =
       new NotificationCompat.Builder(this)
               .setSmallIcon(R.mipmap.ic_launcher)
               .setContentTitle("Title")
               .setContentText("Notification text");
 
Notification notification = builder.build();
 
NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);

Використовуємо білдер, у якому вказуємо іконку, заголовок і текст для повідомлення. Методом build отримуємо готове повідомлення.

Далі використовуємо NotificationManager і його метод notify, щоб показати створене повідомлення. Крім notification, потрібно передати id. Це необхідно, щоб надалі ми могли використовувати цей id для оновлення або видалення повідомлення.

Конструктор new NotificationCompat.Builder(Context) буде позначений як Deprecated, якщо ви використовуєте бібліотеку appCompat версії 26 і вище. Так вийшло тому, що в Android API 26 з'явився новий конструктор і рекомендується використовувати його. Поки що не звертайте увагу на це.

Запустивши цей код, ми побачимо повідомлення

Воно відображає іконку і два тексти, які ми вказували в білдері. Натискання на нього ні до чого не призведе, тому що ми не реалізували обробник натискання. Ми це зробимо трохи пізніше.

Оновлення

Ми відобразили повідомлення і тепер хочемо його оновити. Для цього потрібно просто знову показати сповіщення методом notify і використовувати при цьому той самий id.

Це матиме такий вигляд:

NotificationCompat.Builder builder =
       new NotificationCompat.Builder(this)
               .setSmallIcon(android.R.drawable.ic_dialog_email)
               .setContentTitle("Title change")
               .setContentText("Notification text change");
 
Notification notification = builder.build();
 
NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);

Код повністю аналогічний коду, що ми використовували під час відображення повідомлення. Тільки в білдері використовуємо інші тексти та іконку. Найголовніше, що в методі notify ми знову використовуємо id = 1. NotificationManager за цим id знайде повідомлення, яке ми відобразили трохи раніше, і замінить його новим.

Кілька повідомлень

Щоб показати нове сповіщення, а не оновити вже наявне, треба використовувати інший id у методі notify.

Перше повідомлення

NotificationCompat.Builder builder =
       new NotificationCompat.Builder(this)
               .setSmallIcon(R.mipmap.ic_launcher)
               .setContentTitle("Title")
               .setContentText("Notification text");
 
Notification notification = builder.build();
 
NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);

Друге повідомлення

NotificationCompat.Builder builder =
       new NotificationCompat.Builder(this)
               .setSmallIcon(android.R.drawable.ic_dialog_email)
               .setContentTitle("Title 2")
               .setContentText("Notification text 2");
 
Notification notification = builder.build();
 
NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(2, notification);

Ми використовували різні id у методі notify і отримали два різних повідомлення

Видалення

Щоб видалити повідомлення, використовуємо NotificationManager і його метод cancel із зазначенням id повідомлення.

NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(1);

Або методом cancelAll можемо видалити всі повідомлення відразу

NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancelAll();

Під час видалення повідомлення немає необхідності перевіряти, відображається воно чи ні. Якщо повідомлення з якихось причин уже немає, то просто нічого не станеться.

Обробка натискання

Щоб виконати будь-яку дію після натискання на повідомлення, необхідно використовувати PendingIntent. PendingIntent - це контейнер для Intent. Цей контейнер може бути використаний для подальшого запуску вкладеного в нього Intent.

Ми створюватимемо Intent для запуску, наприклад, Activity, упаковуватимемо цей Intent у PendingIntent і передаватимемо PeningIntent у сповіщення. Після натискання на сповіщення, система дістане з нього PendingIntent і використає вкладений у нього Intent, щоб запустити Activity.

Давайте подивимося, як це виглядає на практиці:

Intent resultIntent = new Intent(this, MainActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent,
               PendingIntent.FLAG_UPDATE_CURRENT);

Створюємо Intent для запуску Activity і пакуємо його в PedningIntent.

Створений PendingIntent нам треба буде передати в білдер повідомлення. Повний код створення повідомлення виглядатиме так:

// Create PendingIntent
Intent resultIntent = new Intent(this, MainActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent,
               PendingIntent.FLAG_UPDATE_CURRENT);
 
// Create Notification
NotificationCompat.Builder builder =
       new NotificationCompat.Builder(this)
               .setSmallIcon(R.mipmap.ic_launcher)
               .setContentTitle("Title")
               .setContentText("Notification text")
               .setContentIntent(resultPendingIntent);
 
Notification notification = builder.build();
 
// Show Notification
NotificationManager notificationManager =
       (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(1, notification);

Передаємо PendingIntent у метод setContentIntent білдера повідомлення.

Після натискання на повідомлення відкриється MainActivity

Зверніть увагу, що повідомлення не видаляється автоматично після натискання на нього. Щоб виправити це, можна в білдері сповіщення використовувати увімкнути параметр autoCancel

setAutoCancel(true)

Повідомлення, створене з цим прапором, буде закриватися після натискання на нього.

Білдер повідомлення має ще кілька методів, які можуть бути корисними.

setNumber - дає змогу додати число в сповіщення