1. Прежде чем начать
Создание мессенджера — непростая задача. Хотя общее впечатление от использования субъективно, Android предоставляет API для обмена сообщениями и взаимодействия с пользователями, которые улучшают и упрощают процесс чата.
В этом практическом занятии вы научитесь использовать эти API для создания привлекательной экосистемы для чат-приложений на Android. Вы расширите функциональность приложения JetChat , простого и нефункционального чат-приложения, использующего Jetpack Compose.
Предварительные требования
- Базовые знания разработки под Android.
- Базовые знания об уведомлениях
Что вы построите
Расширенная версия приложения JetChat, выполняющая следующие функции:
- Отображает уведомления, представляющие собой беседы, в разделе зарезервированных бесед в панели уведомлений.
- В этих уведомлениях ссылки позволяют делиться данными с целевыми объектами, что дает возможность интегрировать их в беседы вашего приложения.
- Обеспечивает соблюдение передовых методов создания этих объектов, чтобы использовать преимущества стандартных возможностей системы, улучшающих работу вашего приложения.
Что вы узнаете
- Как отображать уведомления, относящиеся к беседам, в разделе закрытых бесед в панели уведомлений.
- Как разобраться в различных возможностях, предоставляемых API для обмена сообщениями и взаимодействия с пользователями.
Что вам понадобится
- Гит
- Android Studio
- Аккаунт на GitHub
2. Настройка
В качестве отправной точки используется приложение JetChat . Стартовый код расширяет возможности приложения JetChat, чтобы лучше продемонстрировать API для обмена сообщениями и взаимодействия с пользователями.
Получите стартовый код
Чтобы получить стартовый код для этого практического занятия, выполните следующие шаги:
- В командной строке клонируйте следующий репозиторий GitHub:
git clone –branch starter-code \ https://github.com/android/people-messaging-codelab.git
- Откройте проект в Android Studio, а затем нажмите
Запустите приложение . Появится панель эмулятора , которая отобразит приложение.
Изучите расширенные возможности приложения JetChat.
- В текстовом поле «Сообщения #композиторы» приложения введите сообщение и нажмите «Отправить» .
- Выйдите из приложения. Через несколько секунд вы получите push-уведомление с ответом от участника чата.
3. Создайте уведомления о новых сообщениях в чате.
В Android 11 были представлены API, позволяющие отображать уведомления, связанные с чатами, в специально отведенном разделе панели уведомлений, предназначенном исключительно для переписки.

Уведомление должно иметь класс Notification.MessagingStyle и ссылаться на долгосрочный ярлык для обмена данными . В этом разделе вы узнаете, как выполнить эти требования API, чтобы отображать уведомления, представляющие собой беседы, в разделе «Беседы».
Чтобы настроить уведомления класса NotificationCompat.MessagingStyle , выполните следующие действия:
- В разделе «Проект» в Android Studio щелкните
app>java>com.example.compose.jetchat>conversation, а затем дважды щелкнитеConversationFragment. - В файле
ConversationFragment.ktнайдите классConversationFragment, а затем блок кодаNotificationфункцииcreateNotification, где создается уведомление. - Замените метод
setContentTextметодомsetStyle, который устанавливает стиль уведомления в соответствии со стилем классаNotificationCompat.MessagingStyle. Этот вспомогательный класс добавляет сообщение, установленное методомsetContextText, с дополнительным контекстом, относящимся к сообщению, таким как время отправки и отправитель.
ConversationFragment.kt
private fun createNotification(
notificationId: Int,
message: Message,
person: Person,
shortcut: ShortcutInfoCompat,
time: Long
): Notification? {
...
.setStyle(NotificationCompat.MessagingStyle(person).addMessage(
NotificationCompat.MessagingStyle.Message(
message.content,
time,
person
)
)
)
...
.build()
}
Запустите приложение
- Запустите приложение.
- В текстовом поле «Сообщения #композиторы» приложения введите сообщение и нажмите «Отправить» .
- Выйдите из приложения. Вы снова получите push-уведомление, но оно будет оформлено иначе. Оно будет включать аватар и другой стиль сообщения. Однако, прежде чем ваши уведомления появятся там, где должны, предстоит еще поработать.
4. Создайте целевые объекты для обмена информацией в рамках обсуждений.
В уведомлении необходимо указать ярлык или целевой объект для обмена. Целевые объекты для обмена определяются в файле shortcuts.xml и являются точками входа для обработки ярлыков, определенных программно. Созданные вами ярлыки представляют собой диалоги в приложении и позволяют обмениваться контентом в ваших беседах.
Определить целевые показатели акций
- На вкладке «Проект» щелкните правой кнопкой мыши по каталогу
resи выберите «Создать» > «Каталог» . - В текстовом поле введите
xmlи нажмитеEnter(илиreturnв macOS). - Щелкните правой кнопкой мыши по каталогу
xmlи выберите «Файл» . - В текстовом поле введите
shortcuts.xmlи нажмитеEnter(илиreturnв macOS). - В файле
shortcuts.xmlукажите целевой объект для обмена даннымиtext/plainтипа:
shortcuts.xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<share-target android:targetClass="com.example.compose.jetchat.NavActivity">
<data android:mimeType="text/plain" />
<category android:name="com.example.compose.jetchat.share.TEXT_SHARE_TARGET" />
</share-target>
</shortcuts>
- На вкладке «Проект» щелкните
manifests, а затем дважды щелкните файлAndroidManifest.xml. - В файле
AndroidManifest.xmlопределите файлshortcuts.xml:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compose.jetchat">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Jetchat.NoActionBar">
...
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</application>
</manifest>
- В компоненте
activityфайлаAndroidManifest.xmlопределите фильтр намерений, содержащий логику обмена данными:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compose.jetchat">
...
<activity
...
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
...
Определить сочетания клавиш
Для каждого уведомления необходимо связать соответствующий ярлык. Для каждого диалога определяется только один уникальный ярлык, поскольку этот уникальный ярлык представляет собой единственный контакт, с которым нужно поделиться уведомлением.
Чтобы создать ярлык, выполните следующие действия:
- На вкладке «Проект» щелкните
app>java>com.example.compose.jetchat>conversation>util, а затем дважды щелкнитеConversationUtil. - В файл
ConversationUtil.ktдобавьте функциюgenerateShortcut:
ConversationUtil.kt
import android.content.Intent
import androidx.core.content.pm.ShortcutInfoCompat
import com.example.compose.jetchat.NavActivity
class ConversationUtil {
companion object {
...
fun generateShortcut(context: Context, shortcutId: String): ShortcutInfoCompat {
return ShortcutInfoCompat.Builder(context, shortcutId)
.setCategories(setOf(CATEGORY_SHARE))
.setLongLived(true)
.setShortLabel(shortcutId)
.setLongLabel(shortcutId)
.setIntent(
Intent(context, NavActivity::class.java)
.setAction(Intent.ACTION_VIEW)
)
.build()
}
Эта функция содержит методы setPerson и setLongLived необходимые для диалога. «Person» — это контакт, связанный с ярлыком, и установка значения long-lived в true гарантирует, что этот ярлык будет кэширован системой и отображаться на различных элементах пользовательского интерфейса.
Укажите ярлык в уведомлении.
В уведомлении необходимо указать ссылку на ярлык для обмена данными. Однако ярлык нужно создать до отправки уведомления.
Для этого выполните следующие шаги:
- В файле
ConversationFragment.ktнайдите классConversationFragment. - Перед вызовом переменной
notificationсоздайте переменнуюshortcut, которая ссылается на ярлык, сгенерированный с помощьюConversationUtil.generateShortcut. - В методе
createNotificationпеременнойnotificationзаменитеnullна значение переменной-shortcut, указанное в качестве параметра.
ConversationFragment.kt
private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
val shortcut = ConversationUtil.generateShortcut(context!!, message.author)
val notification = createNotification(notificationId, message, person, shortcut, time)
...
}
}
- В методе
createNotificationдобавьте методNotificationCompat.Builder#setShortcutInfo, а затем передайте переменную,shortcutв качестве параметра.
ConversationFragment.kt
private fun createNotification(
notificatoinIf: Int,
messagin: Message,
person: Person,
shortcut: ShortcutInfoCompat?,
time: Long
): Notification {
...
return NotificationCompat.Builder(context!!, ConversationUtil.CHANNEL_MESSAGES)
...
.setShortcutInfo(shortcut)
.build()
}
Опубликовать ярлык
- Чтобы опубликовать ярлык, в функции
simulateResponseAsANotificationперед методомnotificationManager.notifyвызовите методpushDynamicShortcut:
ConversationFragment.kt
import androidx.core.content.pm.ShortcutManagerCompat
...private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
...
}
}
Запустите приложение
- Запустите приложение.
- В текстовом поле «Сообщения #композиторы» приложения введите сообщение и нажмите «Отправить» .
- Выйдите из приложения. Вы снова получите push-уведомление, но оно оформлено более явно как уведомление, связанное с беседой. Значок аватара стал более заметным и интегрирован со значком приложения. Отправитель, время и текст также стали более лаконичными.
5. Дополнительно: Включить всплывающие окна.
Функция «пузырьков» (Bubbles) была представлена в Android 9, а в Android 11 была улучшена и переработана для использования в контексте диалогов. «Пузырьки» — это круглые наложения, которые служат аватарами для ваших разговоров. Они появляются в панели запуска приложений и позволяют легко отвечать на сообщения в развернутом окне. Даже при наличии такой функции, «пузырьки» остаются необязательными и зависят от предпочтений пользователя.
Чтобы включить отображение пузырьков, выполните следующие действия:
- В файле
AndroidManifest.xmlдобавьте атрибутыallowEmbeddedиresizeableActivity, а затем установите для каждого из них значениеtrue:
AndroidManifest.xml
<activity
...
android:allowEmbedded="true"
android:resizeableActivity="true"
...
</activity>
- В класс
ConversationUtilфайлаConversationUtil.ktдобавьте метаданные для всплывающих окон:
ConversationUtil.kt
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
fun createBubbleMetadata(context: Context, icon: IconCompat): NotificationCompat.BubbleMetadata {
// Create bubble intent
val target = Intent(context, NavActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, REQUEST_BUBBLE, target, flagUpdateCurrent(mutable = true))
// Create bubble metadata
return NotificationCompat.BubbleMetadata.Builder(bubbleIntent, icon)
.setDesiredHeight(400)
.setSuppressNotification(true)
.build()
}
- В файле
ConversationFragment.ktсоздайте и укажите метаданные всплывающего окна уведомления:
ConversationFragment.kt
private fun createNotification(
notificatoinIf: Int,
messagin: Message,
person: Person,
shortcut: ShortcutInfoCompat?,
time: Long
): Notification {
...
// Reference the bubble metadata in the notification.
return NotificationCompat.Builder(context!!, ConversationUtil.CHANNEL_MESSAGES)
...
.setBubbleMetadata(ConversationUtil.createBubbleMetadata(context!!, person.icon!!))
...
.build()
}
Запустите приложение
- Запустите приложение.
- В текстовом поле «Сообщения #композиторы» приложения введите сообщение и нажмите «Отправить» .
- Выйдите из приложения. Через несколько секунд вы получите уведомление из чата в виде всплывающего окна.
- Нажмите на всплывающее окно. Диалог начнётся из всплывающего окна.

6. (Необязательно): Поделитесь ссылкой
Вы указали целевые объекты для обмена информацией и упомянули их в своих уведомлениях, что также позволило отображать ваш контакт в таблице обмена информацией — компоненте, который появляется при отправке намерения ACTION . Целевые объекты для обмена информацией отображаются в верхней части таблицы и позволяют делиться расширенным контентом в ваших беседах.
Чтобы открыть панель общего доступа, выполните следующие действия:
- На своем устройстве откройте Google Chrome и перейдите на любую веб-страницу по вашему выбору, например, developer.android.com .
- При необходимости нажмите
Больше вертикального . - Нажмите
Функция «Поделиться» отображается в нижней части экрана.

- Если возможно, нажмите
JetChat . URL-адрес публикуется в чате. - Если вы этого не видите
JetChat , нажмите
Чтобы открыть меню общего доступа, проведите пальцем вверх по меню и нажмите на него.
JetChat . URL-адрес публикуется в чате.
Это простой пример. Существуют и более сложные типы контента для обмена. Для получения дополнительной информации см. раздел «Получение простых данных из других приложений» .
7. Поздравляем!
Поздравляем! Теперь вы знаете, как добавить функции чата в Android-приложение с помощью API Messaging и People. Приятного общения!