1. 事前準備
訊息應用程式製作方式相當困難。整體使用者體驗屬於主觀判斷,Android 提供 Messaging API 和 People API,改善和簡化即時通訊體驗。
在這個程式碼研究室中,您將瞭解如何使用這些 API 為 Android 上的即時通訊應用程式打造具有吸引力的生態系統。您擴充了 JetChat 應用程式,這是一款使用 Jetpack Compose 的裸機和非功能即時通訊應用程式。
必要條件
- 對 Android 開發作業有基本瞭解
- 通知的基本知識
建構項目
可執行下列操作的擴充 JetChat 應用程式:
- 顯示通知,代表通知導覽匣的保留對話部分中的對話。
- 在這些通知中提及共用目標,讓您參與應用程式對話。
- 強制執行建立這些物件的最佳做法,以利用系統強化應用程式提供的預設體驗。
課程內容
- 如何在通知導覽匣的保留對話部分中顯示對話相關的通知。
- 如何瞭解 Messaging and People API 帶來的各種體驗。
軟硬體需求
- Git
- Android Studio
- GitHub 帳戶
2. 做好準備
起點是以 JetChat 應用程式為基礎。範例程式碼會擴充 JetChat 應用程式,以更理想的方式展示 Messaging API 和 People API。
取得範例程式碼
如要取得本程式碼研究室的範例程式碼,請按照下列步驟操作:
- 從指令列複製以下 GitHub 存放區:
git clone –branch starter-code \ https://github.com/android/people-messaging-codelab.git
- 在 Android Studio 中開啟專案,然後按一下 「Run app」。系統會隨即顯示「Emulator」窗格,並顯示應用程式。
探索 JetChat 擴充應用程式
- 在應用程式的「訊息 #composers」文字方塊中輸入訊息,然後輕觸「傳送」。
- 離開應用程式。幾秒後,您會收到推播通知,其中包含即時通訊中某位參與者的回覆。
3. 建立對話通知
Android 11 導入了 API,可讓即時通訊相關通知顯示在通知導覽匣中的指定部分 (這是僅供對話使用)。
通知必須屬於 Notification.MessagingStyle
類別,並參照長效 共用捷徑。本節將說明如何滿足這些 API 規定,以便在對話專區中顯示代表對話的通知。
如要接收 NotificationCompat.MessagingStyle
課程的通知,請按照下列步驟操作:
- 在 Android Studio 的「Project」分頁中,按一下
app
>java
>com.example.compose.jetchat
>conversation
,然後按兩下ConversationFragment
。 - 在
ConversationFragment.kt
檔案中找出ConversationFragment
類別,然後找出建立通知的createNotification
函式Notification
程式碼區塊。 - 將
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()
}
執行應用程式
- 執行應用程式。
- 在應用程式的「訊息 #composers」文字方塊中輸入訊息,然後輕觸「傳送」。
- 離開應用程式。您又收到了推播通知,但樣式改變。包括訊息的顯示圖片和獨特風格。不過,在通知顯示位置之前,還需要完成一些步驟。
4. 建立對話的共用目標
您必須參照通知中的共用捷徑或分享目標。共用目標是在 shortcuts.xml
檔案中定義,也是處理以程式輔助方式定義的捷徑的進入點。您建立的捷徑代表應用程式中的對話,可讓您在對話中分享內容。
定義共用目標
- 在「專案」「專案」分頁中,以滑鼠右鍵按一下
res
目錄,然後選取新增 >Directory。 - 在文字方塊中,輸入
xml
,然後按下Enter
鍵 (macOS 為return
)。 - 在
xml
目錄上按一下滑鼠右鍵,然後選取「File」。 - 在文字方塊中,輸入
shortcuts.xml
,然後按下Enter
鍵 (macOS 為return
)。 - 在
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>
- 在「Project」分頁中,按一下「
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>
- 在
AndroidManifest.xml
檔案的activity
元件中,定義包含共用邏輯的意圖篩選器:
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>
...
定義捷徑
你必須為每則通知與相關的捷徑建立關聯。每個對話只能定義一個專屬捷徑,因為專屬捷徑代表一位聯絡人的分享對象。
如要產生捷徑,請按照下列步驟操作:
- 在「Project」分頁中,按一下「
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
方法。此人是與捷徑相關聯的聯絡人,並將長效設為 true
值,可確保系統快取這個捷徑,並顯示在 UI 的不同介面上。
參照通知中的捷徑
你必須參照通知中的共用捷徑。不過,你必須建立捷徑,才能推送通知。
步驟如下:
- 在
ConversationFragment.kt
檔案中,找到ConversationFragment
類別。 - 在呼叫
notification
變數之前,請先建立shortcut
變數,藉此參照從ConversationUtil.generateShortcut
產生的捷徑。 - 在
notification
變數的createNotification
方法中,將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()
}
發布捷徑
- 如要發布捷徑,請在
notificationManager.notify
方法之前的simulateResponseAsANotification
函式中呼叫pushDynamicShortcut
方法:
ConversationFragment.kt
import androidx.core.content.pm.ShortcutManagerCompat
...private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
...
}
}
執行應用程式
- 執行應用程式。
- 在應用程式的「訊息 #composers」文字方塊中輸入訊息,然後輕觸「傳送」。
- 離開應用程式。您又收到了一則推播通知,但其樣式更顯像對話相關的通知。顯示圖片圖示更醒目,也整合了應用程式圖示。寄件者、時間和文字訊息也變得更精簡了。
5. 選用:啟用對話框
對話框是在 Android 9 中導入,並針對 Android 11 的對話進行改善及重新利用。對話框是圓形的重疊元素,是顯示在對話中的顯示圖片。這類對話會顯示在應用程式啟動器中,方便你透過展開式泡泡回覆對話。即使已導入對話框,但使用者仍可自行選用。
如要啟用對話框,請按照下列步驟操作:
- 在
AndroidManifest.xml
檔案中新增allowEmbedded
和resizeableActivity
屬性,然後將每個屬性設為true
值:
AndroidManifest.xml
<activity
...
android:allowEmbedded="true"
android:resizeableActivity="true"
...
</activity>
- 在
ConversationUtil.kt
檔案的ConversationUtil
類別中,新增對話框中繼資料:
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()
}
執行應用程式
- 執行應用程式。
- 在應用程式的「訊息 #composers」文字方塊中輸入訊息,然後輕觸「傳送」。
- 離開應用程式。幾秒後,你會收到以對話框形式顯示的通知訊息。
- 輕觸泡泡。對話會以對話框開啟。
6. 選用:分享連結
您已宣告分享目標,並在通知中參照這些目標,而 Sharesheet 會在傳送 ACTION
意圖時顯示的下半部元件,並在 Sharesheet 中顯示聯絡人。共用目標會顯示在 Sharesheet 的頂端,方便您在對話中分享多媒體內容。
如要叫用 Sharesheet,請按照下列步驟操作:
- 在裝置上開啟 Google Chrome,然後前往您選擇的網頁,例如 developer.android.com。
- 如有需要,請按一下 「更多端點」。
- 按一下「分享」圖示 。Sharesheet 會顯示在畫面底部。
- 請盡可能按一下「JetChat」JetChat。系統會在即時通訊中分享網址。
- 如果找不到 「JetChat」JetChat,請按一下 「更多」JetChat叫用系統 Sharesheet,然後在 ShareSheet 中向上滑動並按一下 JetChat「JetChat」。網址會在即時通訊中分享。
這只是一個簡單的範例。可以分享更豐富的內容類型。詳情請參閱從其他應用程式擷取簡單資料。
7. 恭喜
恭喜!現在您已經瞭解如何使用 Messaging and People API,為 Android 應用程式新增即時通訊相關功能。祝您聯絡愉快!