Android studio уведомления при выключенном приложении
What You'll Be Creating
Google запустил первый предварительный просмотр следующей версии Android для разработчиков, в настоящее время под кодовым названием Android O (возможно, Oreo?). Были выпущены некоторые интересные функции и одна из них — Notification Channels (каналы уведомлений). В этом уроке мы рассмотрим этот функционал и создадим простое приложение, демонстрирующее эту функциональность.
Что такое каналы уведомлений?
Каналы уведомлений, позволяют нам разработчикам приложений группировать наши уведомления в группы — каналы — позволяя пользователям изменять настройки уведомлений для всего канала разом. Например, для каждого канала, пользователи могут полностью блокировать все уведомления, изменять уровни важности или включать, чтобы показывались значки уведомления.
Мы собираемся изучить эту функцию при построении простого приложения названного «TutsplusAlerts», в котором будут два канала уведомления: Android и iOS. Пользователь получит уведомление от одного из этих каналов, как только новая статься будет опубликована.
1. Настройка Android O SDK
Чтобы начать использовать Android O API так, как тут описано, вам потребуется последная Android Studio 2.4 Canary.
Запустите Android Studio 2.4 и откройте SDK Manager, через Tools > Android > SDK Manager.
Затем во вкладке SDK Platforms, отметьте Show Package Details. Ниже Android O Preview, отметьте следующее: Android SDK Platform O и Google APIs Intel x86 Atom System Image (требуется только для эмулятора).
Затем переключитесь на вкладку SDK Tools и выберите следующее:
- Android SDK Build-Tools 26.0.0 (rc1 или выше)
- Android SDK Platform-Tools 26.0.0 (rc1 или выше)
- Android Emulator 26.0.0
- Support Repository
2. Создание проекта Android Studio
В Android Studio, создайте новый проект с названием TutsplusAlerts с пустой активити MainActivity .
3. Обновление build.gradle
Перейдите к файлу модуля вашего приложения build.gradle и обновите версии compileSdkVersion , buildToolsVersion и targetSdkVersion , и наконец Support Library.
Не забудьте синхронизировать ваш проект, после сделанных изменений.
4. Создание каналов уведомлений
Создайте новый класс, дополняющий ContextWrapper и назовите его NotificationUtils .
В коде выше, мы создали два экземпляра NotificationChannel , передав в его конструктор id (который должен быть уникальным для вашего пакета), название канала, а также уровень важности. Для каждого канала уведомлений, мы применили такие данные, как звук, свет, вибрация и само уведомление, для отображение на заблокированном экране. Наконец, мы получили NotificationManager из системы, а затем зарегистрировали канал, вызвав метод createNotificationChannel() , передав канал, который мы создали.
С помощью createNotificationChannels() , мы можем создавать сразу несколько каналов уведомлений, передавая Java-список экземпляров NotificationChannel . С помощью getNotificationChannels() вы можете получить все каналы уведомлений для приложения, а с помощью getNotificationChannel() получить определённые каналы, передавая в качестве аргумента, только id нужного канала.
Уровни важности
Начиная с Android O, уровни очерёдности больше не работают для конкретных уведомлений. Вместо этого, вы задаете уровень важности, при создании канала уведомлений — от NotificationManager.IMPORTANCE_NONE до NotificationManager.IMPORTANCE_HIGH . Мы настроим канал Android на IMPORTANCE_DEFAULT , а канал iOS будет IMPORTANCE_HIGH .
Полный список доступных вариантов важности:
- IMPORTANCE_MAX : не используется
- IMPORTANCE_HIGH : показывается везде, производит шум и визуально заметен
- IMPORTANCE_DEFAULT : показывается везде, производит шум, но визуально не заметен
- IMPORTANCE_LOW : показывается везде, но визуально не заметен
- IMPORTANCE_MIN : отображается незаметно
- IMPORTANCE_NONE : уведомление без важности; не отображается даже незаметно
Всем уведомлениям канала, будет задан одинаковый уровень влажности.
5. Создание уведомлений и отправка его по каналам
Мы создадим два Уведомления для каждого из наших каналов в классе NotificationUtils , который мы создали. В конструкторе Notification.Builder (Android API 25), мы указали, какое уведомление должно быть отправлено в канал, где мы передали id канала, в качестве второго аргумента.
Имейте в виду, что в Notification.Builder() также есть метод установки идентификатора канала уведомлений, называемый setChannel(String channelId) , поэтому вы можете выбрать установку идентификатора канала уведомления либо в конструкторе, либо с помощью метода для его установки.
6. Создаем маркет XML
7. Отправка уведомлений по каналам
Отправка в канал Android
В этом разделе, мы отредактирую нашу MainActivity так, чтобы сможем получать заголовок и автора из компонентов EditText , а затем отправлять в канал Android. Мы получим Notification.Builder для канала Android, который мы создали в нашем NotificationUtils , а затем уведомим (метод notify) NotificationManager .
На этом этапе, запустите приложение, укажите заголовок и автора, а затем нажмите кнопку отправки, чтобы немедленно получить уведомление.
Отправка в канал iOS
Снова запустите приложение, укажите заголовок и автора, а затем нажмите кнопку отправки, чтобы немедленно получить уведомление.
8. Настройки каналов уведомления
На момент написания, вы не можете программно изменить параметры настроек определённого канала уведомлений. Только пользователь может перейти на экран настроек уведомлений для этого приложения, в системных настройках устройства. Поэтому, у пользователя есть доступ к настройкам уведомления предложения, чтобы изменить в такие параметры, как вибрация, звук и т.д. Пользователь может перейти к настройкам уведомления приложения, одним из следующих способов:
Редактируем XML макет
Добавьте другую кнопку, которая будет отправлять пользователя в настройки канала уведомления.
Кодим Intent
Здесь мы создаём intent и передаем ему действие «Настройки» — ACTION_CHANNEL_NOTIFICATION_SETTINGS (API 25), а затем добавим дополнительные значения: имя пакета приложения и идентификатор (id) канала. Наконец, мы начинаем работу настройки Активити с intent.
Запустите приложение и нажмите по настройкам уведомления для канала Android.
В настройках канала уведомления, пользователи могут редактировать такие настройки канала, как включение вибрации, смена важности или отображение значка (если поддерживается).
Если вы хотите предоставить пользователям основные настройки уведомления для вашего приложения, вы можете сделать это с помощью Intent :
9. Создание групп уведомлений
Также, мы можем копировать каналы уведомлений в группы, тогда ими можно будет управлять совместно. Это полезно для приложений, которые поддерживает несколько учётных записей пользователей. Те же каналы уведомлений доступны для отдельных учетных записей. Например, приложение социальной сети может иметь поддержку как личного, так и бизнес аккаунтов. Код ниже показывает, как создать группу канала уведомлений.
Мы использовали метод NotificationManagercreate NotificationChannelGroup() , передав ему экземпляр NotificationChannelGroup , которому нужны id и название группы, для создания экземпляра.
После этого, нам нужно объединить каналы уведомлений в группу, используя метод NotificationChannel.setGroup() и передав в него id группы. Если вы хотите создать несколько групп уведомлений за раз, используете createNotificationChannelGroups() , передав ему Java-список экземпляров NotificationChannelGroup .
10. Удаляем канал уведомления
Если канал уведомления больше не нужен, его можно запросто удалить. Просто используйте метод управления уведомлением deleteNotificationChannel() и передайте ему id канала.
Однако имейте в виду, что удаленные каналы остаются видимыми в настройках уведомлений, чтобы предотвратить спам.
Заключение
Чтобы узнать больше о каналах уведомлений — Notification Channels, обратитесь к официальной документации. В это время, посмотрите некоторые из наших других курсов и уроков по разработки для Android!
В принципе, уведомления – отдельная от сервисов тема. Но чаще всего уведомления используются именно в сервисах, поэтому я решил дать эту тему сейчас.
В андроид есть строка вверху экрана. Называется она статус-бар. Туда обычно в виде иконок сваливаются различные уведомления для пользователя (новые письма, смс и прочие). Пользователь открывает статус бар – видит там чуть более подробную инфу о событии. Дальше он может либо стереть это уведомление, либо нажать на него и перейти непосредственно к событию.
В этом уроке научимся все это проделывать. Для начала разберем уведомление на логические составляющие, чтобы проще было понять как его создавать и отправлять.
Первая часть – то, что видно в статус-баре, когда уведомление только приходит – иконка и текст. Текст потом исчезает и остается только иконка.
Вторая часть – то, что мы видим, когда открываем статус бар (тянем вниз). Там уже полноценный View с иконкой и двумя текстами, т.е. более подробная информация о событии.
Третья часть – то, что произойдет, если мы нажмем на View из второй части. Тут обычно идет вызов Activity, где мы можем просмотреть полную информацию и обработать событие.
Кроме этого есть еще несколько возможностей, по которым совсем кратко пробежимся в конце урока.
Создадим приложение и сервис. Сервис, как будто загружает файл и посылает уведомление, по нажатию на которое будет открываться приложение и отображать имя файла.
Project name: P0991_ServiceNotification
Build Target: Android 2.3.3
Application name: ServiceNotification
Package name: ru.startandroid.develop.p0991servicenotification
Create Activity: MainActivity
Добавим в strings.xml строки:
Кнопки для старт/стопа сервиса и TextView для отображения результата
Создаем сервис MyService.java и прописываем его в манифесте. В манифесте же настроим сервис так, чтобы он работал в отдельном процессе. Для этого надо в его атрибуте process написать двоеточие и какое-нить слово.
Система эту строку добавит к package сервиса и, тем самым, получит название нового процесса, в котором и запустит сервис
MainActivity.java:
В onCreate мы вытаскиваем из intent и кладем в TextView текст. Этот текст мы будем отправлять из сервиса через уведомление.
onClickStart и onClickStop – это обработчики кнопок. Стартуют и останавливают сервис.
MyService.java:
В onStartCommand запускаем паузу на 5 секунд (эмулируем закачку файла) и после этого отправляем уведомление. Именно из-за этой паузы мы и используем другой процесс, чтобы не тормозило основное приложение.
В sendNotif мы создаем и отправляем уведомление. Правда, немного в иной последовательности, что я описывал выше. Сначала первая часть, потом третья, потом вторая.
Первая часть – создаем Notification. В конструкторе указываем иконку и текст, которые будут видны в статус-баре. Также мы здесь указываем время. Обычно это текущее время. Но можно указать и прошлое и будущее. По этому времени уведомления будут отсортированы в статус-баре и в его раскрытой части.
Третья часть – создаем Intent, который мы бы использовали для вызова нашего Activity. Туда помещаем имя загруженного файла. Activity его достанет и поместит в TextView. Далее мы оборачиваем этот Intent в PendingIntent, с помощью метода getActivity. На вход ему передаем контекст и Intent. Второй параметр не используется (так написано в хелпе). А четвертый – это флаги, влияющие на поведение PendingIntent. Они не относятся к теме урока, мы их не используем.
Теперь этот созданный PendingIntent содержит информацию о том, что надо вызывать Activity, а также объект Intent, который для этой цели надо использовать. Это будет использовано при нажатии на уведомлении.
Вторая часть – вызываем метод setLatestEventInfo. Передаем на вход контекст, текст-заголовок, подробный текст и PendingIntent. Теперь, когда мы откроем статус-бар, мы увидим два этих текста (заголовок и подробный). А, когда нажмем на уведомление, система использует PendingIntent для запуска Activity.
Далее мы для созданного уведомления ставим флаг FLAG_AUTO_CANCEL, чтобы оно исчезло из статус-бара после нажатия. По умолчанию оно не исчезает и продолжает висеть.
Далее вызываем метод notify для менеджера уведомлений и передаем туда ID и созданное уведомление. ID используется, если мы хотим изменить или удалить уведомление.
Все сохраним, запустим.
Проходит 5 сек и появляется уведомление (первая часть)
Открываем статус-бар и видим более подробную инфу (вторая часть)
Жмем на уведомление.
Открывается наше приложение (третья часть) и в TextView появляется текст, переданный из сервиса.
Теперь вкратце пробежимся по остальным интересным возможностям уведомлений.
Обновление старого или новое уведомление
Если вы создадите новое уведомление и отправите его (notify) с тем же ID, что и у уже существующего уведомления, то новое заменит старое. Таким образом, вы можете уведомления обновлять.
Если же надо показать новое уведомление, то используйте другой ID.
Удаление
Чтобы убрать уведомление из статус-бара, используется метод cancel у менеджера уведомлений. На вход подается ID. Либо используйте метод cancelAll, чтобы удалить все уведомления.
Если хотите, чтобы уведомление появилось со стандартным звуком, добавьте флаг Notification.DEFAULT_SOUND в поле уведомления defaults.
А для использования своих звуков используется поле sound.
Чтобы проиграть файл с SD:
notif.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
Чтобы использовать какую-либо из стандартных мелодий, используем Content Provider:
notif.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
Вибра
Если хотите, чтобы уведомление появилось со стандартной виброй, добавьте флаг Notification.DEFAULT_VIBRATE в поле уведомления defaults.
А для использования своей комбинации вибры используется поле vibrate. В это поле помещается массив long-чисел. Первое – длительность паузы (в миллисекундах) перед началом вибрирования, второе – длительность вибрирования, третье – длительность паузы, четвертое – длительность вибрирования … и т.д. Т.е. создаете свою комбинацию пауз и вибрирования. И мобила при получении уведомления вам ее провибрирует.
Для работы вибры необходимо прописать права VIBRATE в манифесте.
Индикатор
Если хотите, чтобы уведомление появилось с миганием индикатора, добавьте флаг Notification.DEFAULT_LIGHTS в поле уведомления defaults.
А для использования своей комбинации мигания индикатора используются поля
ledARGB – здесь задается цвет
ledOffMS – время «не горения»
В итоге индикатор будет мигать с заданными значениями и с заданным цветом. В хелпе написано, что не все девайсы поддерживают разные цвета. Поэтому выбранный вами цвет не гарантируется.
Число
У Notification есть поле number. Вы можете поместить туда число больше нуля и оно отобразится на уведомлении.
Например, при notif.number = 3 уведомление будет выглядеть так:
Флаги
Добавляются в поле flags
FLAG_INSISTENT – звук уведомления будет повторяться, пока не откроют статус-бар
FLAG_ONGOING_EVENT – уведомление появляется не в обычной секции, а в ongoing (постоянные). Уведомления из этой секции не удаляются при нажатии кнопки очистки уведомлений.
FLAG_NO_CLEAR – уведомление не удалится при очистке всех уведомлений
Не очень понимаю, в чем разница между ongoing и тем, что уведомление не удалится после нажатия на кнопку очистки всех уведомлений. Но флаги такие есть, и я о них упомянул.
На следующем уроке:
- изучаем IntentService
- включаем режим Foreground для сервиса
- помещаем сервис в автозагрузку
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Давайте сегодня напишем проект в Android Studio с использованием нотификации, то есть уведомлений в верхней строке мобильного устройства.
Смотрите видео: Уведомления - Notifications в Android Studio
Создадим новый проект, используем EmptyActivity , нажмем Next, дадим названием проекта, например, TestNotification , пусть будет так.
Тут всё оставляем как есть, минимальный уровень будет подобран исходя из установленных SDK пакетов, у меня минимум это 5 андроид. Нажмем Finish.
Из activity_main.xml удалим TextView с надписью «Hello World», и добавим кнопку Button , и расположим ее по центру.
Перейдём в MainActivity , объявим переменные для работы, будем использовать Notification manager , менеджер уведомлений, notify_id для разделения, если нам понадобится несколько уведомлений в одном приложении, добавим переменную CHANNEL_ID и кнопку. Я по старой привычке назову ее b1 .
В onCreate свяжем кнопку с переменной, через findViewById(R.id.button) , поскольку кнопка имеет id button.
Подключим notificationmanager , он получит из приложения контекст и будет доступен NOTIFICATION_SERVICE уведомлений.
Теперь напишем обработчик нажатия на кнопку b1 setonclicklistener (New view.onclicklistener) .
В onclick объявим intent , который будет работать с MainActivity , нашей основной формой, добавим флаги для работы с уведомлениями либо очистить, либо создать новые.
Определим отложенный Intent , он будет работать с флагом обновление. Теперь напишем NotificationCompat.Builder , построитель наших уведомлений, исходя из контекста будет передавать этот channal_id , добавим setAutoCancel(false) .
Присвоим для уведомления иконку, я специально не готовил ее, и использовать буду ту, которая есть в проекте в ресурсах. Вы можете выбрать или добавить сюда свою, у меня будет небольшая иконка Android.
Передаем текущее время в миллисекундах, setcontentintent присвоим отложенный intent , который мы указали ранее.
Передадим приоритет, в принципе, его можно будет изменить, вот сейчас система требует, чтобы мы добавили поддержку ранней версии, нажмем alt+Enter, и в импорт добавится подключение приоритета.
Можно его изменить его на HIGH или default, по умолчанию, давайте изменил приоритет на высокий.
Так по этой части у нас как бы всё, теперь нужно объявить ещё одну функцию, пока ее нет, напишем ее ниже, для работы с notificationManager , поскольку уведомления были разработаны под определённые версии и начиная на сколько я помню с третей или с четвертой, могут возникать проблемы и уведомления не будут отображаться.
Напишем public static void createChannelIfNeeded - NotificationManager manager , если версия sdk больше или равно версии O (oreo) или API 26, а я использую API 27(версия андроид 8.1), то будем использовать NotificationManager создавая канал уведомлений, new NotificationChannel и createNotificationChannel . Соответственно, при использовании SDK ниже api 26 такая проверка не потребуется.
Вот такой код получился, по импорту всё, сохраняем.
Давайте построим проект по ctrl+f9, проверим нет ли ошибок, вроде всё хорошо, теперь можно запустил эмулятор, дождемся запуска.
Идёт установка apk на эмулятор, при нажатии на кнопку в верхней строке появится уведомление с названием приложения(TestNotification), время получения уведомления – now – сейчас, так как в эмуляторе английский язык, заголовок и наш текст.
Удалим все уведомления и повторим нажатие на кнопку, все работает. Если нажать на кнопку и свернуть приложение, сделать клик по уведомлению, то приложение снова появится на экране.
Если вывести ярлык из меню на главный экран эмулятора, то на иконке можно увидеть кружок, означающий, что по этому приложению есть уведомление, если почистить строку уведомлений, кружок исчезнет с иконки приложения.
Класс Android Toast предоставляет удобный способ отображения оповещений пользователей, но проблема в том, что эти оповещения не являются постоянными, что означает, что оповещение мигает на экране в течение нескольких секунд, а затем исчезает.
Чтобы просмотреть подробности уведомления, вам нужно будет выбрать значок, который будет отображать ящик уведомлений, содержащий подробности об уведомлении. При работе с эмулятором с виртуальным устройством вам нужно будет щелкнуть и перетащить строку состояния вниз, чтобы развернуть ее, что даст вам следующие подробности. Это будет всего 64 dp в высоту и называется нормальным видом.
Выше развернутая форма может иметь большой вид, который будет иметь дополнительную информацию об уведомлении. Вы можете добавить до шести дополнительных строк в уведомлении. На следующем снимке экрана показано такое уведомление.
Создание и отправка уведомлений
Шаг 1. Создание построителя уведомлений
Первым шагом является создание построителя уведомлений с помощью NotificationCompat.Builder.build () . Вы будете использовать Notification Builder для установки различных свойств уведомлений, таких как маленькие и большие значки, заголовок, приоритет и т. Д.
Маленькая иконка, установленная setSmallIcon ()
Заголовок, установленный setContentTitle ()
Подробный текст, установленный setContentText ()
Маленькая иконка, установленная setSmallIcon ()
Заголовок, установленный setContentTitle ()
Подробный текст, установленный setContentText ()
У вас есть множество дополнительных свойств, которые вы можете установить для вашего уведомления. Чтобы узнать больше о них, см. Справочную документацию для NotificationCompat.Builder.
Это необязательная часть, которая требуется, если вы хотите прикрепить действие с уведомлением. Действие позволяет пользователям переходить непосредственно от уведомления к Activity в вашем приложении, где они могут просматривать одно или несколько событий или выполнять дальнейшую работу.
Действие определяется PendingIntent, содержащим Intent, который запускает Activity в вашем приложении. Чтобы связать PendingIntent с жестом, вызовите соответствующий метод NotificationCompat.Builder . Например, если вы хотите запустить Activity, когда пользователь щелкает текст уведомления в ящике уведомлений, вы добавляете PendingIntent, вызывая setContentIntent () .
Объект PendingIntent помогает вам выполнить действие от имени вашего приложения, часто в более позднее время, не заботясь о том, запущено ваше приложение или нет.
Мы воспользуемся объектом стека, который будет содержать искусственный задний стек для запущенного Activity. Это гарантирует, что переход в обратном направлении от действия приводит к тому, что ваше приложение переходит на главный экран.
Наконец, вы передаете объект Notification в систему, вызывая NotificationManager.notify () для отправки вашего уведомления. Убедитесь, что вы вызываете метод NotificationCompat.Builder.build () для объекта компоновщика, прежде чем уведомлять его. Этот метод объединяет все параметры, которые были установлены, и возвращает новый объект уведомления .
Класс NotificationCompat.Builder
Класс NotificationCompat.Builder позволяет легче контролировать все флаги, а также помогает создавать типовые макеты уведомлений. Ниже приведены несколько важных и наиболее часто используемых методов, доступных как часть класса NotificationCompat.Builder.
Построение уведомлений ()
Объедините все параметры, которые были установлены, и верните новый объект уведомления.
NotificationCompat.Builder setAutoCancel (логический autoCancel)
Установка этого флага сделает так, чтобы уведомление автоматически отменялось, когда пользователь щелкает его на панели.
NotificationCompat.Builder setContent (представления RemoteViews)
Предоставьте пользовательский RemoteView для использования вместо стандартного.
NotificationCompat.Builder setContentInfo (информация о CharSequence)
Установите большой текст в правой части уведомления.
NotificationCompat.Builder setContentIntent (намерение PendingIntent)
Укажите PendingIntent для отправки при нажатии на уведомление.
NotificationCompat.Builder setContentText (текст CharSequence)
Установите текст (вторая строка) уведомления в стандартном уведомлении.
NotificationCompat.Builder setContentTitle (заголовок CharSequence)
Установите текст (первая строка) уведомления в стандартном уведомлении.
NotificationCompat.Builder setDefaults (int defaults)
Установите параметры уведомления по умолчанию, которые будут использоваться.
NotificationCompat.Builder setLargeIcon (значок растрового изображения)
Установите большой значок, который отображается в тикере и уведомлении.
NotificationCompat.Builder setNumber (int number)
Установите большое число в правой части уведомления.
Ниже приводится содержимое измененного основного файла активности src / com.example.notificationdemo / MainActivity.java . Этот файл может включать в себя каждый из основных методов жизненного цикла.
Ниже приведено содержимое измененного основного файла активности src / com.example.notificationdemo / NotificationView.java .
Ниже будет содержимое файла res / values / strings.xml для определения двух новых констант:
Big View Notification
Читайте также: