Android открыть приложение по нажатию на уведомление
Получение пользователей для установки вашего приложения - это только половина битвы. Получение их для регулярного использования - это другая половина. Вполне возможно, что ваши пользователи полностью забывают о вашем приложении после использования его только один или два раза. Что со всеми другими новыми приложениями, конкурирующими за их внимание.
Используя push-уведомления, вы можете время от времени напоминать пользователям о своем приложении, повышая вероятность того, что ваше приложение останется на их устройствах.
Google Cloud Messaging, GCM для краткости - это бесплатный сервис, который вы можете использовать для отправки push-уведомлений вашим пользователям. В этом уроке вы узнаете, как использовать его для создания приложения для Android, которое может получать push-уведомления, и простой Python скрипт на стороне сервера, который может их генерировать и отправлять.
Зачем использовать Google Cloud Messaging?
Обычно это достигается за счет поддержания постоянного TCP/IP-соединения - соединения, которое остается постоянно открытым между сервером и клиентом. Это может показаться замечательным, но если у вас популярное приложение, поддержка тысяч постоянных соединений между вашим сервером и устройствами ваших пользователей может быть очень дорогостоящим.
Google Cloud Messaging - это служба, которая решает эту проблему, выступая в качестве посредника между вашим сервером и устройством вашего пользователя. С помощью GCM Google’s Cloud Connection Server, часто называемый CCS, управляет постоянными подключениями для вас. Он также обеспечивает надежную доставку ваших push-уведомлений.
Предпосылки
Чтобы следовать за мной, вам нужно:
- Последняя версия Android Studio
- Python 2.7.6 или выше
- Устройство под управлением Android 4.4 или выше с установленными сервисами Google Play
1. Настройка проекта Android Studio
Запустите Android Studio и создайте новый проект с пустой Activity . Если вы использовали значения по умолчанию, проект должен включать класс Java в MainActivity.java.
Шаг 1: добавьте зависимости
В этом проекте мы будем использовать Google Services gradle plugin для настройки GCM. Включите его в проект, добавив следующую строку в раздел dependencies в build.gradle проекта:
Затем примените плагин в модуле app build.gradle:
Чтобы иметь возможность использовать API GCM, добавьте com.google.android.gms: play-services Как compile зависимость в том же файле:
Если вы нажмете кнопку «Синхронизировать сейчас», вы увидите следующую ошибку:
Шаг 2: обновите манифест
Внутри файла AndroidManifest.xml проекта создайте и используйте специальное разрешение C2D_MESSAGE на основе имени пакета вашего проекта. Убедитесь, что для параметра ProtectionLevel установлено разрешение в значение signature.
Уведомления поступают в виде трансляций. Для обработки этих трансляций нашему приложению требуется BroadcastReceiver . Однако нам не нужно создавать его вручную. Вместо этого мы можем использовать класс GcmReceiver как BroadcastReceiver .
У BroadcastReceiver должен быть intent-filter , который отвечает на действие com.google.android.c2dm.intent.RECEIVE , а имя его category должно соответствовать имени пакета вашего проекта. Добавьте в манифест следующий код:
2. Получите ключ API сервера и идентификатор отправителя
При общении с сервером облачных соединений нам необходимо идентифицировать себя с помощью ключа API на стороне сервера и идентификатора отправителя на стороне клиента. Чтобы получить ключ API и идентификатор отправителя, создайте новый проект в консоли разработчика.
Начните с нажатия кнопки «Выбрать платформу». Затем нажмите кнопку «Включить службы для моего приложения Android App». Когда вы это сделаете, вас попросят указать ваше имя и имя пакета Android для вашего приложения. Убедитесь, что указанное вами имя пакета Android соответствует имени пакета, которое вы ввели при создании проекта Android Studio.
Затем нажмите кнопку «Выбрать и настроить службы» внизу. Теперь вы можете выбрать сервисы Google, которые хотите добавить в приложение.
Плагин Google Services, который мы добавили ранее, требует правильной работы файла конфигурации. Создайте файл, нажав кнопку «Создать конфигурационные файлы».
После того, как файл был сгенерирован, загрузите его и поместите в каталог app проекта Android Studio.
GCM идентифицирует устройства Android с помощью токенов регистрации. Поэтому наше приложение должно иметь возможность регистрироваться на каждом Android-устройстве, на котором оно установлено.
Шаг 1. Создание службы регистрации
Создайте новый класс Java под названием RegistrationService.java, сделайте его подклассом IntentService и переопределите его метод onHandleIntent .
Внутри метода onHandleIntent мы можем использовать API идентификатора экземпляра для создания или получения регистрационного токена. Во-первых, создайте экземпляр класса InstanceID , используя его метод getInstance .
Теперь мы можем использовать метод getToken объекта InstanceID для получения регистрационного токена в виде String . GetToken ожидает идентификатор отправителя как один из его аргументов. Поскольку мы добавили файл google-services.json в наш проект, мы можем передать идентификатор отправителя методу, используя R.string.gcm_defaultSenderID .
Теперь я покажу вам, как подписаться на topic под названием my_little_topic. Требуется всего две строки кода. Сначала создайте новый экземпляр класса GcmPubSub , используя его метод getInstance . Затем вызовите его метод subscribe и передайте ему токен регистрации вместе с названием темы.
Теперь наше приложение может получать каждое push-уведомление, опубликованное в my_little_topic.
Наконец, определите службу в AndroidManifest.xml.
Служба регистрации завершена.
Шаг 2. Создание службы InstanceIDListenerService
Токены регистрации периодически обновляются. Следовательно, каждое приложение для Android, использующее GCM, должно иметь InstanceIDListenerService , который может обрабатывать эти обновления. Поэтому создайте новый файл Java под названием TokenRefreshListenerService.java и сделайте его подклассом InstanceIDListenerService . Внутри метода onTokenRefresh этого класса все, что нам нужно сделать, это просто начать процесс регистрации снова, запустив службу регистрации с использованием метода Intent и startService .
Добавьте следующий код в TokenRefreshListenerService.java:
Эта служба должна иметь возможность реагировать на действие com.google.android.gms.iid.InstanceID . Поэтому, определяя службу в AndroidManifest.xml, добавьте соответствующий intent-filter .
Шаг 3: Запуск службы регистрации
Чтобы процесс регистрации начался сразу после запуска приложения, мы должны запустить класс RegistrationService внутри метода onCreate у MainActivity . Для этого создайте для него Intent и используйте метод startService .
4. Отображение Push-уведомлений
GCM автоматически отображает push-уведомления в лоток уведомлений, как только они будут получены. Однако он делает это только в том случае, если связанное приложение содержит GCMListenerService .
Создайте новый класс Java с именем NotificationsListenerService и сделайте его подклассом GCMListenerService . Если вы не хотите обрабатывать вставленные данные самостоятельно, вам не нужно писать код внутри этого класса. Мы можем оставить этот класс пустым.
Определяя службу в AndroidManifest.xml, убедитесь, что вы добавили intent-filter , который позволяет ему отвечать на com.google.android.c2dm.intent.RECEIVE .
5. Добавление значков Push Notification
У каждого push-уведомления должен быть связанный с ним значок. Если у вас нет такой возможности, вы можете получить ее в Material Design Icons Library.
Как только вы загрузите значок, поместите его в папку res вашего проекта. Я буду использовать ic_cloud_white_48dp в качестве значка.
6. Запуск приложения для Android
Теперь наше Android-приложение завершено. После того, как вы скомпилируете его и запустите на Android-устройстве, вы сможете увидеть маркер регистрации в логах logcat.
7. Отправка Push-уведомлений
В заключительной части этого учебника мы создадим простой Python скрипт, который может генерировать и отправлять push-уведомления всем устройствам Android, на которых установлено наше приложение.
Вы можете запустить этот скрипт с локального компьютера или с удаленного веб-сервера, к которому у вас есть доступ к SSH.
Шаг 1. Создание сценария
Создайте новый файл с именем send.py и откройте его, используя ваш любимый текстовый редактор.
В верхней части файла импортируйте модули urllib2 и urllib . Мы будем использовать эти модули для отправки данных на Google Cloud Connection Server. Импортируйте модуль json , потому что отправляемые данные должны быть действительными JSON. Наконец, чтобы получить доступ к аргументам командной строки, импортируйте модуль sys .
Каждое уведомление должно иметь название и тело. Вместо жесткого кодирования в нашем скрипте давайте примем название и тело как аргументы командной строки, используя массив argv .
Создайте новый словарь Python для представления данных, которые должны быть отправлены в CCS. Чтобы наше приложение для Android могло получать уведомление, оно должно быть опубликовано в тему my_little_topic. Поэтому добавьте ключ to в словарь, и установите его значение в /themes/my_little_topic.
Чтобы представить содержимое уведомления, добавьте ключ, называемый notification в словарь, и установите его значение для другого словарного объекта, содержащего три ключа:
Убедитесь, что значение icon совпадает с именем значка, который можно использовать в вашем проекте Android.
Преобразуйте словарь в строку JSON, используя функцию dumps модуля json :
Наконец, чтобы выполнить запрос и получить ответ, передайте объект запроса функции urlopen и вызовите его метод read .
Теперь скрипт Python завершен и готов к использованию.
Шаг 2. Запуск сценария
Передайте имя сценария исполняемому файлу python вместе со строкой для заголовка уведомления, а другое - для тела уведомления. Вот пример, который вы можете использовать:
Если ошибок нет, вы должны получить ответ, который выглядит так:
Если вы проверите свое Android-устройство, вы увидите новое уведомление в лотке уведомлений.
Заключение
Теперь вы знаете, как отправлять push-уведомления своим пользователям. На этом занятии вы узнали, как создать Android-приложение, способное регистрироваться и получать уведомления, публикуемые по определенной теме. Вы также узнали, как создать скрипт Python, который может публиковать уведомления.
Несмотря на то, что push-уведомления могут показаться отличным способом общения с вашими пользователями, я предлагаю вам использовать их экономно и только если у вас есть что-то полезное, потому что слишком много слишком часто - это, пожалуй, самый быстрый способ чтобы ваше приложение оказалось удаленным.
В прошлом уроке мы уже рассмотрели, как отобразить Activity по нажатию на уведомление. Но там был простой случай. В этом уроке рассмотрим более интересные случаи.
Чтобы понимать все, о чем дальше пойдет речь, вам понадобятся знания об Activity Tasks Stack. Почитать об этом можно в документации или в Уроке 116.
Для примера возьмем почтовое приложение, состоящее из трех экранов: список писем (MainActivity), содержимое письма (DetailsActivity) и информация о новой версии (WhatsNewActivity). При запуске приложения MainActivity отображает письма, а по нажатию на письмо открывается DetailsActivity c содержимым письма.
У приложения есть какой-то сервис, который связан с сервером. Когда на сервере появляется новое письмо, сервис скачивает его и показывает пользователю уведомление. Пользователь нажимает на него и открывается DetailsActivity для просмотра письма.
Аналогично, сервис получает информацию о новой версии приложения и создает уведомление для этого события. По нажатию на уведомление будет открываться WhatsNewActivity, в котором будут подробно расписаны новые фичи приложения.
Но открывать два этих Activity мы будем разными способами.
С экраном WhatsNewActivity ситуация другая. Он предназначен только для открытия из уведомления. Из приложения его открыть невозможно. Т.е. в приложении просто нет такого списка или такой кнопки, которые открыли бы WhatsNewActivity. Потому что это не особо важная информация, и, если вы вдруг сами захотели посмотреть ее, вы можете сходить на сайт приложения.
Давайте рассмотрим, как реализуются два этих варианта
DetailsActivity, как часть приложения
Сначала настроим DetailsActivity в манифесте:
Атрибут parentActivityName и тег meta-data здесь делают абсолютно одно и тоже - они сообщают, что DetailsActivity открывается из MainActivity. Т.е. MainActivity является родительским для DetailsActivity. Различие лишь в том, что meta-data работает для Android 4.0.3 и ниже, а parentActivityName - для Android 4.1 и выше. Т.е. указываем параметр parentActivity двумя разными способами для обеспечения совместимости. Если ваше приложение уже не поддерживает Android ниже 4.1, то meta-data вы можете не указывать.
Далее создаем уведомление. Все так же, как мы рассматривали в прошлом уроке. Отличаться будет только создание PendingIntent.
EXTRA_ITEM_ID - это ваша строковая константа
Рассмотрим по шагам, что здесь происходит.
Создаем обычный Intent для открытия DetailsActivity. Передаем туда id, чтобы Activity знало, какую информацию ему надо отобразить. Тут все понятно и обычно.
Затем создаем TaskStackBuilder - инструмент, который поможет нам сформировать последовательность вызовов Activity. Нам надо, чтобы сначала запустилось родительское Activity для DetailsActivity (т.е. MainActivity), а затем и само DetailsActivity.
Вызываем метод addParentStack и указываем в нем DetailsActivity, т.е. просим в стек вызовов добавить Activity, которое является родительским для DetailsActivity. TaskStackBuilder идет в манифест и видит, что для DetailsActivity в качестве родительского (parentActivityName) прописано MainActivity. TaskStackBuilder добавляет MainActivity в стек вызовов.
В addNextIntent мы просто передаем Intent для запуска DetailsActivity. TaskStackBuilder добавит его в свой стек вызовов.
В итоге TaskStackBuilder содержит в стеке вызовов два Activity: сначала MainActivity, а затем DetailsActivity.
Методом getPendingIntent он формирует PendingIntent, который мы сможем передать в билдер уведомления. И по нажатию на уведомление будут открыты Activity, которые были в стеке вызовов, сформированном в TaskStackBuilder.
Запускаем, жмем на уведомление
Все работает, но осталась одна мелочь. Уведомление не закрывается по нажатию на него. Можно использовать setAutoCancel, как мы делали в прошлом уроке, но это не совсем правильно в данном случае.
Допустим вам приходит уведомление о новом письме. Но вы пока не открывали это уведомление, а решили сразу зайти в приложение, там уже увидели новое письмо, открыли его, прочитали и закрыли приложение. Письмо теперь прочитано вами, а уведомление продолжает висеть, хотя оно уже не актуально.
Правильнее будет удалять уведомление при открытии соответствующего ему письма. Рассмотрим, как это можно реализовать.
Код создания уведомления:
Весь код нам уже знаком. Пройдусь только по части id.
У вас есть id письма (itemId), пусть он будет long. Используя itemId, вы можете создать id для уведомления (notificationId) и далее указать его в методе notify.
Теперь, чтобы удалить уведомление, вам необходимо использовать такой же notificationId в методе cancel.
Реализуем это в DetailsActivity:
Достаем itemId из Intent. Из itemId снова формируем notificationId и используем его в методе cancel.
В результате, при открытии письма в DetailsActivity, уведомление, соответствующее этому письму, будет удалено. И неважно, пришли вы на этот экран сами или по нажатию на уведомление.
Важно, чтобы notificationId, используемый при показе и удалении уведомления совпадал. В нашем примере мы вычисляем его из itemId, просто взяв int часть от long. У вас может быть другой способ получения или формирования этого id.
WhatsNewActivity, отдельное от приложения
Рассмотрим другой вариант. Напомню, что он предполагает открытие Activity отдельно от приложения.
Для этого Activity должно быть настроено следующим образом в манифесте:
launchMode установлен в singleTask, чтобы Activity искало или создавало свой таск. taskAffinity делаем пустым, чтобы Activity не ушло в основной таск приложения. excludeFromRecents нужен, чтобы таск этого Activity не отображался в recent списке приложений.
Создание уведомления выполняется по обычной схеме, только в Intent надо добавить пару флагов, чтобы Activity стартовало в новом пустом таске
В итоге, по нажатию на уведомление будет открываться Activity в отдельном от вашего приложения таске.
И его не будет видно в списке последних запущенных приложений
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
- новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
В этом уроке мы научимся создавать уведомления ( Notifications ) с помощью PendingIntent , а также разберем различные настройки и кастомизацию наших уведомлений.
Краткий обзор PendingIntent в Android
Для начала нам нужно понять для чего нужен объект PendingIntent .
И так, PendingIntent является оболочкой для объектов Intent (намерений) и определяет действие, которое должно выполниться в будущем. Как правило, он используется в для запуска уведомлений или в паре с AlarmManager для повторяющихся действий.
Из соображений безопасности, передающийся в PendingIntent объект Intent должен явно задавать имя компонента. Каждый явный Intent в свою очередь должен обрабатываться такими компонентами, как Activity, BroadcastReceiver или Service. Для этого PendingIntent использует следующие методы:
Рассмотрим создание PendingIntent на примере:
Intent intent = new Intent ( this , SomeActivity . class ) ; PendingIntent pendingIntent = PendingIntent . getActivity ( this , 1 , intent , PendingIntent . FLAG_UPDATE_CURRENT ) ;Рассмотрим подробнее параметры, которые мы передали в методе getActivity() :
Уведомления в Android. Объекты Notification
Создаем Notification в Android. Наиболее используемые методы
Уведомления создается с помощью класса NotificationManager , как показано ниже:
NotificationManager notificationManager = ( NotificationManager )Также предоставляется интерфейс Notification.Builder для создания объекта уведомления:
NotificationCompat . Builder mNotificationBuilder = new NotificationCompat . Builder ( this )Теперь давайте рассмотрим наиболее используемые методы при создании уведомлений:
Интерфейс Notification.Builder позволяет добавлять до трех кнопок с определёнными действиями на одно уведомление.
Начиная с версии Android API 4.1 и выше Android появилась большие уведомления с расширенным функционалом.
Отменяемые уведомления в Android
Android позволяет нам отменять уведомления с помощью вызова метода cancel() для конкретного уведомления (получаем по id) или вызвать метод NotificationManager.c ancelAll() для удаления всех ранее полученных уведомлений.
Создаем уведомление (Notification) в Android
В нашем тестовом приложении мы создадим объект Intent для просмотра конкретной веб-страницы, обернем его в PendingIntent и заставим вызываться по нажатию пользователя. Также добавим функцию отмены уведомления.
Считаете ли вы, что панель уведомлений Android можно сделать более продуктивной? Как насчет того, чтобы разместить ярлыки нескольких ваших любимых приложений на панели уведомлений, а затем запускать их прямо оттуда одним касанием? Теперь это можно сделать с помощью приложения под названием Запуск из уведомления 2 (приложение было переименовано) Простая панель быстрого доступа, который представляет собой удобный инструмент, который позволяет добавлять ярлыки до трех приложений по вашему выбору в область уведомлений / состояния и, в отличие от аналогичных приложений, таких как Bar Control и Smart Bar, включает возможность отображать все три ярлыка в одном линия в указанной области, обеспечивая более быстрый доступ к вашим любимым приложениям. Вы также можете настроить приложение для отображения одного ярлыка в области уведомлений, при нажатии на который отображается всплывающее окно, содержащее все ярлыки приложений. Тем не менее, это первая функция, которая отличает его от более старых, более популярных альтернатив.
Вы можете спросить, чем это лучше, чем наличие ярлыков на главном экране. Что ж, в отличие от домашнего экрана, область уведомлений доступна отовсюду (кроме, конечно, полноэкранных приложений). Так, если, например, вы просматриваете Интернет на своем устройстве и находите что-то, что хотите сделать снимок экрана, Простая панель быстрого доступа поможет вам запустить ваше любимое приложение для создания снимков экрана без необходимости возвращаться на главный экран. Короче говоря, получить доступ к приложениям из панели уведомлений так же просто, как перетащить панель уведомлений вниз и нажать значок / ярлык необходимого приложения. Нет никаких ограничений на тип или порядок приложений, которые можно закрепить на панели уведомлений.
Платная версия приложения по цене 1,20 доллара США позволяет добавить до 12 ярлыков в область уведомлений.
Читайте также: