T.M. SoftStudio

feci quod potui, faciant meliora potentes

Купить полную версию курса "Программирование мобильных приложений для платформы Android" (русскоязычная версия, лекции, тесты, лабораторные работы)

Программирование мобильных приложений для платформы Android

Лекция 9. Уведомления пользователей. Часть 1

В этом уроке мы будем говорить об уведомлениях.

Уведомления это сообщения, иногда дополняющие то, что приложение показывает пользователям, вне обычного пользовательского интерфейса приложения.

Например, предположим, у вас есть приложение, которое может скачать электронную книгу из Интернета.

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

Или даже выйти из него вообще, в то время как книга загружается.

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

Чтобы сделать это, вам нужно выполнить несколько вещей.

Вы должны выяснить, когда загрузка закончилась и тогда вы должны показать какое-то сообщение, чтобы дать пользователю эту информацию.

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

Первый вид это Toast-сообщения, «выпрыгивающие из тостера» сообщения, которые, я полагаю, получили свое название от того факта, что они всплывают на экране.

Мы на самом деле уже видели тост-сообщения много раз в предыдущих уроках.

Например, мы использовали их немного, чтобы продемонстрировать, что что-то происходило всякий раз, когда мы нажимали на кнопку.

Второй вид, это сообщения области уведомлений или строки состояния.

Эти уведомления можно видеть и к ним может быть доступ в области уведомлений, контролируемой системой, в верхней части устройства.

И опять же, мы уже видели примеры этого.

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

И вы, возможно, помните, что, когда MMS сообщение действительно поступило, появился значок в левом верхнем углу телефона.

И пользователь может затем раскрыть область уведомлений, чтобы получить более подробную информацию о входящем сообщении MMS.

Итак, давайте резюмировать это.

Android предоставляет несколько различных видов уведомлений пользователю.

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

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

Это не уведомления пользователей.

Но сообщение, которое появляется через несколько секунд после нажатия кнопки отправления, которое говорит вам, например, что сообщение было успешно отправлено. Или значок, который появляется в верхней части вашего устройства, указывая, что MMS сообщение прибыло, хотя вы в настоящее время читаете веб-страницы с помощью браузера.

Это уведомления пользователей, о которых мы собираемся говорить сегодня.

Теперь, некоторые Android уведомления пользователей существуют, чтобы обеспечить обратную связь пользователю, сообщая о каком-то последствии его действия.

И одним из таких механизмов являются тост-сообщения, о которых мы говорили.

И еще есть другой механизм – диалоги.

Другой вид уведомлений пользователя это сообщения области уведомлений.

И они, как правило, используются, чтобы объявить непредсказуемые события для пользователя, и сделать это таким образом, чтобы не прерывать все остальное.

И опять же, думаю, это ситуация входящего SMS сообщения.

Помещение значка в области уведомлений говорит вам, что пришло сообщение.

Но это не делается навязчивым или императивным образом.

Сообщение есть, и вы можете свободно иметь дело с ним тогда, когда это удобно для вас.

Тост-сообщения, как вы видели, являются временными сообщениями, которые появляются на дисплее.

Например, чтобы дать пользователю понять, что операция успешно завершена.

Тост-сообщения автоматически исчезают и перекрывают представления.

И их работа заключается в предоставлении информации пользователю, но они не собирают информацию, которая отправляется обратно в приложение.

Вы можете создавать тост-сообщения с помощью метода makeText() класса Toast.

Этот метод принимает пару параметров, включая текст, который вы хотите отобразить и количество времени, в течение которого вы хотите, чтобы текст был виден.

И после того как вы создали тост-сообщение, вы затем можете его отобразить, вызвав метод show(), для тост-сообщения, которое вы только что создали.

Итак, давайте взглянем на пример приложения, которое использует тост-сообщения.

Запустим NotificationToast приложение.

Это приложение отображает одну кнопку Show Toast, и это именно то, что оно будет делать, когда я нажму на кнопку.

Так что я нажму эту кнопку сейчас.

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

Теперь, если мы откроем исходный код приложения, мы увидим, как это реализовано.

Здесь есть слушатель кнопки Show Toast.

Внутри вы видите вызов метода makeText(), в который передается текст и передается постоянная toast.length_long, которая делает текст видимым около трех с половиной секунд.

И в конце этой строки есть вызов метода show(), который на самом деле отображает тост.

Теперь, если вы хотите более необычное сообщение Toast, вы можете создать пользовательский вид для вашего тост-сообщения.

Например, вы можете создать собственный макет в формате XML, загрузить его и присоединить созданное представление к сообщению Toast с вызовом метода setView(View view).

Давайте посмотрим пример NotificationToastWithCustomView.

Как и простой пример NotificationToast, это приложение отображает одну кнопку с надписью Show Toast.

И я могу нажать эту кнопку, чтобы отобразить тост-сообщение.

Однако в этом случае, когда я нажимаю кнопку, вы увидите пользовательское тост представление, а не просто серое окно, что мы видели раньше.

С текстом, ваше тост-сообщение имеет дополнительно глазное яблоко, чтобы помочь довести до сведения текст.

Давайте откроем основную активность для этого приложения и посмотрим, как мы создали тост сообщение.

Теперь, как вы можете видеть, когда кнопка Show Toast нажимается, сначала код создает новый объект Toast.

Следующие две строки устанавливают расположение Toast на дисплее и указывают время, в течение которого сообщение будет видно.

Далее идет вызов метода, чтобы установить представление, в котором первым параметром является результат загрузки макета XML, который находится в custom_toast.xml файле.

Давайте откроем файл.

Теперь здесь можно увидеть, что представление это относительная планировка, содержащая два дочерних компонента.

Первый дочерний компонент это представление изображения глаза.

Второй дочерний компонент представляет собой текстовое представление, отображающее текст, что вы тост.

А потом, еще в основной активности есть завершающая строка, которая вызывает метод для отображения тоста.

Лекция 9. Уведомления пользователей. Часть 2

Другой вид уведомлений пользователя, о которых мы будем говорить в этом уроке это уведомления, которые появляются в области уведомлений.

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

Приложения и сама андроид система могут использовать эту область для информирования пользователей о появление различных событий.

Область уведомлений также предоставляет пользователю элемент интерфейса, который называется drawer-ящик.

И пользователь может потянуть вниз область уведомления, чтобы открыть drawer-ящик.

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

Давайте посмотрим пример того, как эти уведомления используются в Android.

Итак, вот мое устройство и я открою приложение телефона.

А теперь я начну набор телефонного номера и нажму на кнопку вызова.

И телефон начинает набирать номер и подключать телефонный звонок.

Теперь, скажем, в середине этого телефонного звонка мне нужно получить некоторую информацию из Интернета.

Я нажимаю кнопку домой и оттуда я открою приложение браузера и сейчас замечаю, что в левом верхнем углу моего устройства появился новый значок.

Это уведомление.

Когда я вышел из приложения телефон, Android создал этот объект уведомления, и поместил его в в области уведомлений.

И это уведомление служит напоминанием мне, что телефонный звонок все еще подключен, и это также служит способом для меня быстро вернуться к этому телефонному звонку.

Теперь, в браузере, я открою www.google.com, и я буду выполнять поиск.

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

Так что теперь, я потяну вниз область уведомления, чтобы открыть drawer-ящик уведомлений.

И как только он откроется, я увижу некоторую информацию о вызове.

И, это позволяет мне либо подключиться к звонку, или повесить его.

Теперь я хочу продолжить звонок, так что я нажму на область уведомлений.

И это откроет приложение телефон, возвратит приложение обратно на первый план, и позволит мне продолжить говорить по телефону.

Если же вы хотите сами отправить уведомление, есть несколько вещей, которые вы должны рассмотреть.

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

Когда уведомление отправляется, оно будет в конечном итоге размещено в области уведомлений, где маленькая иконка будет отображаться.

Кроме того, вы можете задать ticker-текст уведомления, в этом случае, этот текст будет также отображаться, если уведомление впервые появится в области уведомлений.

Наконец, если пользователь открывает ящик уведомлений, там будет представление, которое по умолчанию включает в себя название, детали или содержание текста, маленький значок и отметку времени.

Вы также должны будете определить любые действия, которые будут происходить, если пользователь нажмет на представлении ящика уведомлений.

Теперь, как только вы создали уведомление, вы можете отправить его, обновить его, отменить его, или др.

Эти операции управляются сервисом Android системы, который называется менеджером уведомлений.

Так что давайте посмотрим на два приложения, которые отправляют уведомления, а затем мы будем смотреть на исходный код, чтобы увидеть, как все это реализуется.

Так вот, я открою приложение NotificationStatusBar.

И его пользовательский интерфейс отображает одну кнопку Notify.

Когда я нажимаю эту кнопку, уведомление будет создано и отправлено, и при этом оно появится в области уведомлений в верхней части телефона.

Итак, позвольте мне нажать на кнопку сейчас.

И уведомление прибыло.

Вы можете увидеть прокручивающийся ticker-текст в области уведомлений.

Теперь после того, как ticker-текст закончит прокручиваться, он уйдет и значок уведомления будет оставаться видимым.

Итак, теперь я открою drawer-ящик уведомлений.

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

И, наконец, есть также время уведомления.

Теперь в этот момент, я закрываю drawer-ящик уведомлений, перейду назад, и нажму кнопку Notify еще один раз.

Теперь я открою drawer-ящик уведомлений, и вы можете видеть, что текст деталей имеет обновленный результат.

Здесь я нажму на уведомление и Вы можете увидеть, что новая активность запустилась, распечатав «Got The Intent».

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

Давайте посмотрим на второе приложение NotificationStatusBarWithCustomView, уведомление строки состояния с пользовательским представлением.

Это приложение делает то же самое, что и предыдущее приложение.

Тем не менее, оно показывает пользовательское представление, когда открывается ящик уведомлений.

Теперь, я запущу приложение и нажму кнопку Notify как и раньше.

Уведомление создается и появляется в области уведомлений.

Однако, когда я открываю ящик уведомлений, я не ожидаю увидеть стандартное представление, я увижу пользовательское представление.

И здесь есть наше глазное яблоко, и слова, You've Been Notified, с номером в скобках.

Теперь я закрою ящик, и я еще раз нажму кнопку Notify.

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

И, наконец, я нажму на представление ящика уведомлений, что запустит новую активность, отображающую слова, Got The Intent.

Хорошо.

Итак, давайте взглянем на код для этого второго приложения NotificationStatusBarWithCustomView.

И вот я снова в интегрированной среде разработки, и я открою основную активность приложения.

Начиная с верха, этот код создает ID для уведомления, которое приложение собирается отправить.

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

Далее есть некоторые переменные, которые содержат текстовые элементы уведомления, в том числе ticker текст, заголовок и содержание.

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

Затем код создает пользовательское представление, которое будет отображаться в ящике уведомлений.

Макет для этого представления находится в файле custom_notification.xml.

Давайте взглянем на него.

Как вы можете видеть, это представление является линейным макетом с двумя видами дочерних компонентов.

Одним из них является изображение, которое отображает глазное яблоко, и другой представляет собой текстовое представление, которое отображает текст уведомления.

Вернемся к основной активности и давайте посмотрим на метод OnCreate.

Здесь код создает Intent-намерение, которое будет активировать субактивность уведомления.

Следующая строка кода представляет собой то, о чем мы не говорили раньше.

Эта строка создает то, что называется ожидающим намерением PendingIntent.

PendingIntent-намерение по существу является скользящим разрешением, которое позволяет одному коду представлять другой код.

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

И он делает это с разрешениями и идентичностью первого сегмента кода.

Далее слушатель кнопки Notify обновляет текстовое содержимое, чтобы указать, сколько раз была нажата кнопка.

Затем создается само уведомление, используя класс Notification.Builder.

Код создает новый объект notificationBuilder, а затем устанавливает ticker-текст, устанавливает маленький значок, а затем устанавливает авто-завершение в true.

Это говорит Android закрыть уведомление, если пользователь нажимает на представление ящика.

Затем код устанавливает контент-намерение и это PendingIntent-намерение, которое определяет действие в случае, когда пользователь нажимает на представление ящика уведомлений.

Затем код устанавливает шаблоны звука и вибрации, которые должны играть, когда поступает уведомление.

И, наконец, код устанавливает пользовательское представление, которое должно отображаться, когда пользователь раскрывает ящик уведомлений.

Теперь, когда уведомление настроено, код получает ссылку на менеджера уведомлений, вызывая getSystemService с передачей идентификатора сервиса уведомлений.

И, наконец, код вызывает метод notify менеджера уведомлений, передавая идентификатор уведомления, что позволяет существующему уведомлению обновиться, и также передает результат вызова метода build объекта notificationBuilder.

И этот метод build на самом деле генерирует реальный объект уведомления.