Thêm các tính năng liên quan đến trò chuyện vào ứng dụng Android bằng API Nhắn tin và API Mọi người

1. Trước khi bắt đầu

Việc tạo một ứng dụng nhắn tin là một thử thách. Mặc dù trải nghiệm tổng thể của người dùng mang tính chủ quan, nhưng Android cung cấp API Nhắn tin và API Người dùng để cải thiện và đơn giản hoá trải nghiệm trò chuyện.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng các API này để tạo một hệ sinh thái hấp dẫn cho các ứng dụng trò chuyện trên Android. Bạn sẽ mở rộng ứng dụng JetChat, một ứng dụng trò chuyện cơ bản và không có chức năng, sử dụng Jetpack Compose.

Điều kiện tiên quyết

  • Kiến thức cơ bản về phát triển Android
  • Kiến thức cơ bản về thông báo

Sản phẩm bạn sẽ tạo ra

Một ứng dụng JetChat mở rộng thực hiện những việc sau:

  • Hiển thị các thông báo đại diện cho cuộc trò chuyện trong phần cuộc trò chuyện dành riêng của ngăn thông báo.
  • Tham chiếu đến các mục tiêu chia sẻ trong những thông báo này để cho phép bạn chia sẻ vào các cuộc trò chuyện của ứng dụng.
  • Thực thi các phương pháp hay nhất để tạo các đối tượng này nhằm tận dụng những trải nghiệm mặc định do hệ thống cung cấp, giúp nâng cao ứng dụng của bạn.

Kiến thức bạn sẽ học được

  • Cách hiển thị các thông báo liên quan đến cuộc trò chuyện trong phần cuộc trò chuyện dành riêng của ngăn thông báo.
  • Cách hiểu các trải nghiệm khác nhau do API Nhắn tin và API Người dùng cung cấp.

Bạn cần có

  • Git
  • Android Studio
  • Tài khoản GitHub

2. Bắt đầu thiết lập

Điểm xuất phát dựa trên ứng dụng JetChat. Mã khởi đầu mở rộng ứng dụng JetChat để giới thiệu rõ hơn về API Nhắn tin và API Người dùng.

Tải mã khởi đầu

Để tải mã khởi đầu cho lớp học lập trình này, hãy làm theo các bước sau:

  1. Từ dòng lệnh, hãy sao chép kho lưu trữ GitHub sau:
git clone –branch starter-code \
https://github.com/android/people-messaging-codelab.git
  1. Mở dự án trong Android Studio, sau đó nhấp vào a1bbb9d97659a043.png Chạy ứng dụng. Ngăn Trình mô phỏng sẽ xuất hiện và hiển thị ứng dụng.

Khám phá ứng dụng JetChat mở rộng

  1. Trong hộp văn bản Message #composers (Thông báo #composers) của ứng dụng, hãy nhập một thông báo, sau đó nhấn vào Send (Gửi).
  2. Di chuyển ra khỏi ứng dụng. Sau vài giây, bạn sẽ nhận được một thông báo đẩy có chứa phản hồi của một người nào đó trong cuộc trò chuyện.

3. Tạo thông báo về cuộc trò chuyện

Android 11 đã giới thiệu các API cho phép thông báo liên quan đến cuộc trò chuyện xuất hiện trong một phần được chỉ định trong ngăn thông báo, chỉ dành cho các cuộc trò chuyện.

Ngăn thông báo xuất hiện khi bạn vuốt xuống từ thanh trạng thái

Thông báo phải thuộc lớp Notification.MessagingStyle và tham chiếu đến lối tắt để chia sẻ lâu dài. Trong phần này, bạn sẽ tìm hiểu cách đáp ứng các yêu cầu của API này để hiển thị những thông báo đại diện cho cuộc trò chuyện trong phần cuộc trò chuyện.

Để tạo thông báo thuộc lớp NotificationCompat.MessagingStyle, hãy làm theo các bước sau:

  1. Trong thẻ Project (Dự án) của Android Studio, hãy nhấp vào app > java > com.example.compose.jetchat > conversation , sau đó nhấp đúp vào ConversationFragment.
  2. Trong tệp ConversationFragment.kt, hãy tìm lớp ConversationFragment, sau đó tìm khối mã Notification của hàm createNotification nơi thông báo được tạo.
  3. Thay thế phương thức setContentText bằng phương thức setStyle để đặt kiểu của thông báo thành lớp NotificationCompat.MessagingStyle. Lớp trợ giúp này thêm thông báo được đặt bằng phương thức setContextText với ngữ cảnh bổ sung liên quan đến thông báo, chẳng hạn như thời gian gửi và người gửi.

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()
}

Chạy ứng dụng

  1. Chạy ứng dụng.
  2. Trong hộp văn bản Message #composers (Thông báo #composers) của ứng dụng, hãy nhập một thông báo, sau đó nhấn vào Send (Gửi).
  3. Di chuyển ra khỏi ứng dụng. Bạn sẽ nhận được một thông báo đẩy khác, nhưng thông báo này được tạo kiểu khác. Thông báo này bao gồm một hình đại diện và kiểu riêng biệt cho thông báo. Tuy nhiên, bạn cần phải làm nhiều việc hơn trước khi thông báo xuất hiện ở đúng vị trí.

4. Tạo mục tiêu chia sẻ cho cuộc trò chuyện

Bạn cần tham chiếu đến một lối tắt để chia sẻ hoặc mục tiêu chia sẻ trong thông báo. Các mục tiêu chia sẻ được xác định trong tệp shortcuts.xml và là điểm truy cập để xử lý các lối tắt được xác định theo phương thức lập trình. Các lối tắt mà bạn tạo đại diện cho các cuộc trò chuyện trong ứng dụng và cho phép bạn chia sẻ nội dung trong các cuộc trò chuyện.

Xác định mục tiêu chia sẻ

  1. Trong thẻ Project (Dự án), hãy nhấp chuột phải vào thư mục res , sau đó chọn New > Directory (Mới > Thư mục).
  2. Trong hộp văn bản, hãy nhập xml, sau đó nhấn Enter (hoặc return trên macOS).
  3. Nhấp chuột phải vào thư mục xml , sau đó chọn File (Tệp).
  4. Trong hộp văn bản, hãy nhập shortcuts.xml, sau đó nhấn Enter (hoặc return trên macOS).
  5. Trong tệp shortcuts.xml, hãy khai báo mục tiêu chia sẻ xử lý việc chia sẻ dữ liệu thuộc loại 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>
  1. Trong thẻ Project (Dự án), hãy nhấp vào manifests , sau đó nhấp đúp vào AndroidManifest.xml.
  2. Trong tệp AndroidManifest.xml, hãy xác định tệp 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>
  1. Trong thành phần activity của tệp AndroidManifest.xml, hãy xác định bộ lọc ý định chứa logic chia sẻ:

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>
...

Xác định lối tắt

Đối với mỗi thông báo, bạn cần liên kết lối tắt có liên quan. Bạn chỉ xác định một lối tắt duy nhất cho mỗi cuộc trò chuyện vì lối tắt duy nhất đại diện cho một người liên hệ để chia sẻ.

Để tạo lối tắt, hãy làm theo các bước sau:

  1. Trong thẻ Project (Dự án), hãy nhấp vào app > java > com.example.compose.jetchat > conversation > util , sau đó nhấp đúp vào ConversationUtil.
  2. Trong tệp ConversationUtil.kt, hãy thêm hàm 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()
}

Hàm này chứa các phương thức setPersonsetLongLived cần thiết cho cuộc trò chuyện. Người liên hệ là người liên hệ được liên kết với lối tắt và việc đặt giá trị lâu dài thành true đảm bảo rằng lối tắt này được hệ thống lưu vào bộ nhớ đệm và hiển thị trên nhiều nền tảng trong giao diện người dùng.

Tham chiếu đến lối tắt trong thông báo

Bạn cần tham chiếu đến lối tắt để chia sẻ trong thông báo. Tuy nhiên, bạn phải tạo lối tắt trước khi đẩy thông báo.

Để thực hiện việc này, hãy làm theo các bước sau:

  1. Trong tệp ConversationFragment.kt, hãy tìm lớp ConversationFragment.
  2. Trước lệnh gọi đến biến notification, hãy tạo một biến shortcut tham chiếu đến lối tắt được tạo từ ConversationUtil.generateShortcut.
  3. Trong phương thức createNotification của biến notification, hãy thay thế null bằng biến shortcut làm tham số.

ConversationFragment.kt

private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       val shortcut = ConversationUtil.generateShortcut(context!!, message.author)
       val notification = createNotification(notificationId, message, person, shortcut, time)
       ...
   }
}
  1. Trong phương thức createNotification, hãy thêm phương thức NotificationCompat.Builder#setShortcutInfo, sau đó truyền biến shortcut làm tham số.

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()
}

Xuất bản lối tắt

  • Để xuất bản lối tắt, trong hàm simulateResponseAsANotification trước phương thức notificationManager.notify, hãy gọi phương thức pushDynamicShortcut:

ConversationFragment.kt

import androidx.core.content.pm.ShortcutManagerCompat

...private fun simulateResponseAsANotification() {
   ...
   if (message.author != "me") {
       ...
       ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
       ...
   }
}

Chạy ứng dụng

  1. Chạy ứng dụng.
  2. Trong hộp văn bản Message #composers (Thông báo #composers) của ứng dụng, hãy nhập một thông báo, sau đó nhấn vào Send (Gửi).
  3. Di chuyển ra khỏi ứng dụng. Bạn sẽ nhận được một thông báo đẩy khác, nhưng thông báo này được tạo kiểu rõ ràng hơn dưới dạng thông báo liên quan đến cuộc trò chuyện. Biểu tượng hình đại diện nổi bật hơn và tích hợp biểu tượng ứng dụng. Người gửi, thời gian và văn bản cũng được đơn giản hoá hơn.

5. Không bắt buộc: Bật bong bóng

Bong bóng được giới thiệu trong Android 9, đồng thời được cải thiện và dùng lại để sử dụng trong bối cảnh cuộc trò chuyện trong Android 11. Bong bóng là lớp phủ hình tròn, là hình đại diện cho cuộc trò chuyện của bạn. Chúng xuất hiện trong trình chạy ứng dụng và cho phép bạn dễ dàng phản hồi các cuộc trò chuyện trong một bong bóng mở rộng. Ngay cả khi được triển khai, bong bóng vẫn là không bắt buộc, tuỳ thuộc vào lựa chọn ưu tiên của người dùng.

Để bật bong bóng, hãy làm theo các bước sau:

  1. Trong tệp AndroidManifest.xml, hãy thêm các thuộc tính allowEmbeddedresizeableActivity, sau đó đặt mỗi thuộc tính thành giá trị true:

AndroidManifest.xml

<activity
  ...
  android:allowEmbedded="true"
  android:resizeableActivity="true"
  ...
</activity>
  1. Trong lớp ConversationUtil của tệp ConversationUtil.kt, hãy thêm siêu dữ liệu bong bóng:

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()
    }
  1. Trong tệp ConversationFragment.kt, hãy tạo và tham chiếu siêu dữ liệu bong bóng trên thông báo:

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()
}

Chạy ứng dụng

  1. Chạy ứng dụng.
  2. Trong hộp văn bản Message #composers (Thông báo #composers) của ứng dụng, hãy nhập một thông báo, sau đó nhấn vào Send (Gửi).
  3. Di chuyển ra khỏi ứng dụng. Sau vài giây, bạn sẽ nhận được một thông báo từ cuộc trò chuyện dưới dạng bong bóng.
  4. Nhấn vào bong bóng. Cuộc trò chuyện sẽ mở ra từ bong bóng.

Bong bóng trò chuyện

6. Không bắt buộc: Chia sẻ đường liên kết

Bạn đã khai báo các mục tiêu chia sẻ và tham chiếu đến chúng trong thông báo. Điều này cũng cho phép hiển thị người liên hệ của bạn trong Trang chia sẻ nội dung, một thành phần từ dưới lên xuất hiện khi ý định ACTION được gửi. Các mục tiêu chia sẻ xuất hiện ở đầu Trang chia sẻ nội dung và cho phép bạn chia sẻ nội dung đa dạng thức trong các cuộc trò chuyện.

Để gọi Trang chia sẻ nội dung, hãy làm theo các bước sau:

  1. Trên thiết bị, hãy mở Google Chrome, sau đó chuyển đến một trang web mà bạn chọn, chẳng hạn như developer.android.com.
  2. Nếu cần, hãy nhấp vào 2fdbaccda71bc5f0.png Thêm dọc.
  3. Nhấp vào 771b0be21764f6b6.png Chia sẻ. Trang chia sẻ nội dung sẽ xuất hiện ở cuối màn hình.

Trang chia sẻ nội dung

  1. Nếu có thể, hãy nhấp vào biểu tượng 468248e6b8a84bb3.png JetChat. URL được chia sẻ trong cuộc trò chuyện.
  2. Nếu bạn không thấy 468248e6b8a84bb3.png JetChat, hãy nhấp vào 145399af71577431.png Thêm để gọi trang chia sẻ nội dung của hệ thống, sau đó vuốt lên trên Trang chia sẻ nội dung và nhấp vào 468248e6b8a84bb3.png JetChat. URL được chia sẻ vào cuộc trò chuyện.

Đây là một ví dụ đơn giản. Có nhiều loại nội dung đa dạng thức để chia sẻ. Để biết thêm thông tin, hãy xem phần Truy xuất dữ liệu đơn giản từ các ứng dụng khác.

7. Xin chúc mừng

Xin chúc mừng! Giờ đây, bạn đã biết cách thêm các tính năng liên quan đến trò chuyện vào một ứng dụng Android bằng API Nhắn tin và API Người dùng. Chúc bạn nhắn tin vui vẻ!

Tìm hiểu thêm