部分企業需要提供快速付款的功能,以便客戶取得或重新獲得服務的存取權 (例如:行動數據方案、家庭帳單、服務升級或先前遭拒的款項)。商家通常會透過行動裝置來通知使用者這類事件。不過,如要實際執行付款動作,使用者就必須切換內容,花費大量時間瀏覽所有表單,而這大大降低了完成付款的可能性。
此模式可協助您將付款動作直接新增至通知中,讓使用者可以立即採取行動,只要輕觸兩下便能迅速付款。本指南將說明如何在 Android 應用程式中建立類似的體驗。
需求條件
本指南假設您的 Android 應用程式已整合了有效的 Google Pay。如果您尚未加入整合服務,不妨先參考我們的教學課程或逐步指南程式碼研究室。
構成要素
將 Google Pay 按鈕新增至通知時,是以 Android 上的兩個基本構成要素為基礎:
自訂通知版面配置
Android 裝置上的一般通知具有完善的剖析定義,可適應多種視覺環境。使用標準範本能幫助您確保不論裝置螢幕方向、板型規格和 OS 版本,通知都能正常顯示,因此建議您以此方式告知使用者需注意的事件。
如果標準的版面配置不符合需求,您也可使用自訂通知版面配置來提供自己的版面配置。在本指南中,您將使用自訂版面配置,將 Google Pay 按鈕新增至通知,好讓使用者直接從該畫面辦理付款。
活動
活動可協助您在應用程式中向使用者展示功能。一般來說,活動會有相關的使用者介面,並構成應用程式中可瀏覽的畫面階層結構。
當使用者按一下 Google Pay 按鈕時,Google 會傳回可用的付款方式清單,以供使用者完成交易。此付款畫面必須透過代管活動啟動。您可以利用透明的活動來建立外觀,讓付款畫面直接顯示在通知之上。
定義通知的版面配置
替通知建立版面配置的程序,和替一般活動定義使用者介面的方式非常類似。通知 (例如小工具) 會使用 RemoteViews 類別來管理版面配置中的元素。這可減少一般版面配置的支援的可用檢視畫面清單。
首先,請在 res/layout/
資料夾中建立版面配置資源檔案,說明您所想要的通知外觀。請參考範例應用程式中的
notification_account_top_up.xml
。
新增 Google Pay 按鈕
一旦版面配置準備就緒,最後一步就是加入 Google Pay 按鈕。方法很簡單,只要從預先建立的 Google Pay 素材資源集合,將適當的按鈕資源加入至您的版面配置 XML 檔案中即可。這些素材資源包含各種按鈕用圖像資源,可配合多種螢幕大小、解析度及語言,而且遵循 Google Pay 品牌宣傳指南。您可以直接透過品牌宣傳指南專區下載這些資源。
<include android:id="@+id/googlePayButton" layout="@layout/buy_with_googlepay_button" android:layout_width="wrap_content" android:layout_height="48sp" />
現在,當您查看版面配置的設計檢視畫面時,就能看到 Google Pay 按鈕:
觸發通知
視應用程式或服務的互動流程而定,您可以依據不同事件分別發送通知。常見的模式是使用訊息服務,從後端伺服器發出推播通知。如果您尚未在 Android 應用程式中加入推送功能,請參閱 Firebase 雲端通訊和絕佳教學課程,以瞭解如何開始使用。
建立及設定檢視畫面
為了初始化通知的版面配置及其內含的檢視畫面,程序的運作方式會與一般活動稍有不同。請分別設定檢視畫面的結構與回應使用者互動的方式。每次狀態有所更新時,您都必須重繪通知。
首先,建立 RemoteViews
物件以存放版面配置階層:
Kotlin
val notificationLayout = RemoteViews(packageName, R.layout.large_notification)
Java
RemoteViews notificationLayout = new RemoteViews(packageName, R.layout.large_notification);
您現在可以使用 notificationLayout
物件來變更基礎檢視畫面 (按鈕、文字、圖片等),例如修改其樣式,或是設為回應使用者互動。在此範例中,Google Pay 按鈕會擷取輕觸事件,以啟動付款流程:
Kotlin
val selectOptionIntent = Intent(context, PaymentNotificationIntentService::class.java) selectOptionIntent.action = ACTION_SELECT_PREFIX + option notificationLayout.setOnClickPendingIntent(buttonId, PendingIntent.getService( context, 0, selectOptionIntent, PendingIntent.FLAG_UPDATE_CURRENT))
Java
Intent payIntent = new Intent(context, PaymentTransparentActivity.class); payIntent.setAction(ACTION_PAY_GOOGLE_PAY); payIntent.putExtra(OPTION_PRICE_EXTRA, OPTION_PRICE_CENTS.get(selectedOption)); notificationLayout.setOnClickPendingIntent( R.id.googlePayButton, pendingIntentForActivity(context, payIntent));
在這個執行個體中,顯示付款畫面的 Intent
包含指明了 Intent
目的之動作,並包含其他資訊 (例如所選項目的價格)。此外,Intent
還將事件與 Google Pay 按鈕建立關聯,如此一來每當使用者輕觸按鈕,Intent
便會執行,並將付款活動置於前景。
顯示通知
在您建立及設定通知後,最後一步便是要對使用者顯示通知。為此,請使用上述定義的參數和其他設定來建構通知物件,以決定其運作方式:
Kotlin
val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(context.getString(R.string.notification_title)) .setContentText(context.getString(R.string.notification_text)) .setCustomBigContentView(notificationLayout) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setAutoCancel(false) .setOnlyAlertOnce(true) .build()
Java
Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(context.getString(R.string.notification_title)) .setContentText(context.getString(R.string.notification_text)) .setCustomBigContentView(notificationLayout) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setAutoCancel(false) .setOnlyAlertOnce(true) .build();
此設定中有部分屬性顯示了此通知的運作方式,但在您的應用程式中,其他屬性則可能依據您的偏好和用途而有所不同。在此將這類欄位列舉如下:
欄位 | 值 | 說明 |
---|---|---|
通知管道 | NOTIFICATION_CHANNEL_ID |
從 Android 8.0 (API 級別 26) 開始,您必須將所有通知指派給某個管道。管道會按照使用者可管理的類別主題將通知分門別類。詳情請參閱 Android 說明文件中的通知管道。 |
自訂大型內容檢視畫面 | notificationLayout |
這就是您先前準備的版面配置連結至通知之處。 |
自動取消 | false |
如果您將通知設為互動 (如這個範例所使用的參數),那麼就可將自動取消參數設為 false ,以確保通知不會在使用者碰到其內的任何檢視畫面時自動關閉。 |
僅提醒一次 | true |
這則通知會回應使用者輸入的內容。請將此參數設為 true ,以避免在通知更新時發出音效、提示和震動。 |
如要瞭解關於通知的其他設定和一般概念,請參閱 Android 說明文件中的自訂通知和總覽章節。
最後,如要觸發並顯示通知,請使用 notify
方法傳入先前建立的 notification
物件:
Kotlin
NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification)
Java
NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification);
NOTIFICATION_ID
是可識別通知的任意整數,於日後更新或移除通知時需要用到。
付款
當使用者輕觸 Google Pay 按鈕時,即顯示付款畫面,以便使用者選擇用來完成交易的付款方式。您可以使用 Google Pay API 在活動之上顯示付款畫面。由於通知會開始新的付款處理,故將此活動設為透明,便能在不開啟應用程式的情況下,給予使用者操作已完成的印象。查看此活動的 onCreate
方法:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Dismiss the notification UI if the activity was opened from a notification if (Notifications.ACTION_PAY_GOOGLE_PAY == intent.action) { sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) } // Initialise the payments client startPayment() }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Dismiss the notification UI if the activity was opened from a notification if (Notifications.ACTION_PAY_GOOGLE_PAY.equals(getIntent().getAction())) { sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } // Initialise the payments client startPayment(); }
如您所見,此活動並不複雜。包含意圖常數 ACTION_CLOSE_SYSTEM_DIALOGS
的廣播會關閉通知選單。提醒您,這項活動只會透過通知中的 Google Pay 按鈕存取,而且若無廣播,通知對話方塊就會保持開啟。
此外,此活動所需的唯一動作,就是顯示付款畫面,也就是透過 showPaymentsSheet
方法啟動的付款畫面。接著只要呼叫 Google Pay API 中的 loadPaymentData
方法即可。請查看範例應用程式中的 PaymentTransparentActivity.java
檔案,以探索該活動中的所有邏輯。