通知泛指 Android 在您應用程式 UI 以外的位置所顯示的訊息,可為使用者提供提醒內容、其他使用者傳來的通訊內容,或是來自您應用程式的即時資訊。使用者可以輕觸通知來開啟應用程式,或直接透過通知執行動作。
本頁概要說明通知的顯示位置和可用功能。如果您想開始建構通知,請改為參閱「建立通知」。
想進一步瞭解通知的設計和互動模式,請參閱「通知設計指南」。您也可以參閱「Android 通知範例」,瞭解在行動裝置和穿戴式應用程式中使用 Notification.Style
API 的最佳做法。
在裝置上的顯示樣式
通知會以不同的格式,顯示在不同的位置供使用者查看,例如狀態列中的圖示、通知導覽匣中較詳細的內容、應用程式圖示上的標記,以及自動出現在已配對的穿戴式裝置上。
狀態列和通知導覽匣
當您發出通知時,通知會先顯示為狀態列中的圖示。
圖 1.顯示在狀態列左側的通知圖示
使用者可以向下滑動狀態列來開啟通知導覽匣,然後在當中查看更詳細的通知內容,以及執行相關動作。
圖 2.通知導覽匣中的通知
使用者可以向下拖曳導覽匣中的通知來展開視圖,藉此顯示更多內容和動作按鈕 (如有提供)。
通知導覽匣中的通知會持續顯示,直到由應用程式或使用者關閉為止。
抬頭通知
從 Android 5.0 開始,通知可以短暫地顯示在稱為「抬頭通知」的浮動式視窗中。這通常是用來發出使用者必須立刻知道的重要通知,而且這種通知只會在裝置解鎖時顯示。
圖 3.顯示在前景應用程式前方的抬頭通知
抬頭通知會在應用程式發出通知時立即顯示,並在短暫的時間過後消失,但會跟平常的通知一樣保留在通知導覽匣中。
可能會觸發抬頭通知的範例條件包括:
- 使用者的活動是以全螢幕模式進行 (應用程式使用
fullScreenIntent
)。 - 在搭載 Android 7.1 (API 等級 25) 或以下版本的裝置上,通知擁有高優先順序且使用鈴聲和震動功能。
- 在搭載 Android 8.0 (API 等級 26) 或以上版本的裝置上,通知管道擁有高重要性。
螢幕鎖定
從 Android 5.0 開始,通知可以顯示在螢幕鎖定畫面中。
您可以利用程式設計的方式,設定應用程式顯示在安全螢幕鎖定畫面中的通知內容詳細程度,甚至還能設定是否要讓通知出現在螢幕畫面中。
使用者可以使用系統設定來選擇螢幕鎖定畫面通知的內容詳細程度,還能選擇停用所有的螢幕鎖定畫面通知。從 Android 8.0 開始,使用者可以分別為每個通知管道選擇要停用或啟用螢幕鎖定畫面通知。
圖 4.顯示在螢幕鎖定畫面中的通知,系統已隱藏通知中的敏感內容
詳情請參閱如何「設定螢幕鎖定畫面的可見度」。
應用程式圖示上的標記
在搭載 Android 8.0 (API 等級 26) 和以上版本的裝置所支援的啟動器中,會在對應的應用程式圖示上顯示彩色的「標記」 (也稱為「通知圓點」),來指出使用者收到新的通知。
使用者可以長按應用程式圖示,查看該應用程式的通知。使用者隨後即可從選單中關閉或處理通知,與通知導覽匣類似。
圖 5.通知標記和長按選單
如要進一步瞭解標記的運作方式,請參閱「通知標記」。
Wear OS 裝置
如果使用者擁有已配對的 Wear OS 裝置,則所有通知都會自動顯示在該裝置上,包括可展開的詳細資料和動作按鈕。
您也可以自訂通知在穿戴式裝置上的部分顯示樣式,藉此強化使用者體驗,並提供各種動作選項,包括建議的回覆內容,以及透過語音輸入回覆。詳情請參閱如何「為穿戴式裝置專用通知新增功能」。
圖 6. 通知會自動顯示在已配對的 Wear OS 裝置上
通知剖析
通知的外觀設計是由系統範本決定,您的應用程式只會定義範本中每個部分的內容。而通知的某些詳細資料只會顯示在展開後的視圖中。
圖 7. 顯示基本詳細資料的通知
我們在圖 7 標示出最常見的通知部分,詳細說明如下:
- 小型圖示:此為必要元素,您可以利用
setSmallIcon()
進行設定。 - 應用程式名稱:這是由系統提供的。
- 時間戳記:這是由系統提供,但您可以利用
setWhen()
以覆寫,或是利用setShowWhen(false)
將其隱藏。 - 大型圖示:此為選用元素 (通常只會用來顯示聯絡人的相片;請勿在此顯示您應用程式的圖示),您可以利用
setLargeIcon()
進行設定。 - 標題:此為選用元素,您可以利用
setContentTitle()
進行設定。 - 文字:此為選用元素,您可以利用
setContentText()
進行設定。
強烈建議您使用系統範本,確保所有裝置都有恰當的設計相容性。不過您也可以視需求建立自訂通知版面配置。
如要進一步瞭解如何建立包含上述功能和其他內容的通知,請參閱「建立通知」。
通知動作
雖然這並非必要,但每則通知在使用者輕觸時,都應該會開啟適當的應用程式活動。除了這項預設的通知動作之外,您也可以新增動作按鈕,以便使用者在通知中完成與應用程式相關的工作 (而且通常不用開啟活動),如圖 9 所示。
圖 9. 含有動作按鈕的通知
從 Android 7.0 (API 等級 24) 開始,您也可以新增動作讓使用者回覆訊息,或是直接在通知中輸入其他文字。
從 Android 10 (API 級別 29) 開始,平台可自動產生動作按鈕,其中包含建議的意圖動作。
如要進一步瞭解新增動作按鈕的相關資訊,請參閱建立通知。
必須解鎖裝置
使用者可能會在裝置的螢幕鎖定畫面上查看通知動作。如果特定通知動作讓應用程式啟動活動或傳送直接回覆,使用者必須先解鎖裝置,應用程式才能叫用該動作。
在 Android 12 (API 級別 31) 及以上版本中,您可以設定通知動作,使其必須解鎖裝置,應用程式才能叫用該動作 (不論動作啟動的工作流程為何)。這個選項可藉由在已鎖定裝置上的通知增添進階安全保障。
如要規定裝置在叫用特定通知動作前必須先解鎖,請在建立通知動作時將 true
傳遞至 setAuthenticationRequired()
,程式碼片段如下所示:
Kotlin
val moreSecureNotification = Notification.Builder( context, NotificationListenerVerifierActivity.TAG) .addAction(...) // This notification always requests authentication when invoked // from a lock screen. .setAuthenticationRequired(true) .build()
Java
Notification moreSecureNotification = new Notification.Builder( context, NotificationListenerVerifierActivity.TAG) .addAction(...) // This notification always requests authentication when invoked // from a lock screen. .setAuthenticationRequired(true) .build();
可展開的通知
根據預設,通知的文字內容會遭到截斷,以便在單行顯示所有內容。如果想增加通知的長度,您可以套用額外的範本來啟用較大型的可展開文字區域,如圖 8 所示。
圖 8. 能夠顯示較多文字的可展開通知
您也可以建立含有圖片、採用收件匣樣式、包含即時通訊對話,或是設有媒體播放控制項的可展開通知。詳情請參閱「建立可展開通知」。
通知更新和群組
為避免您在有額外的更新消息時,向使用者發出數則或多餘的通知,我們建議您更新現有通知,而不是發出新通知,或是考慮使用收件匣樣式的通知,以對話形式來顯示更新消息。
不過,如果您必須發出數則通知,不妨將這些不同的通知組合成一個群組 (Android 7.0 及以上版本提供這項功能)。通知群組能讓您將通知導覽匣中的數則通知收合成一則含有摘要的訊息。使用者只要展開該通知,即可顯示其中每則通知的詳細資料。
使用者可逐步展開通知群組,以及群組中的每則通知來取得詳細資料。
圖 10. 已收合與已展開的通知群組
如要進一步瞭解如何將通知新增至群組中,請參閱「建立通知群組」。
通知管道
從 Android 8.0 (API 等級 26) 開始,所有通知都必須指派專屬管道,否則就不會顯示。將通知分類到不同的管道之後,使用者就能透過 Android 的系統設定針對您的應用程式停用特定通知管道 (而不是停用您的「所有」通知),還能控制每個管道的視覺和聽覺選項 (圖 11)。使用者也可以長按某則通知,來改變相關管道的行為。
在搭載 Android 7.1 (API 等級 25) 及以下版本的裝置上,使用者只能管理個別應用程式的通知 (在 Android 7.1 以下版本中,每個應用程式只有一個管道)。
圖 11.「時鐘」應用程式的通知設定,以及該應用程式的某個管道
一個應用程式可以有好幾個通知管道,換句話說,應用程式發出的每則通知都有一個管道。應用程式也可以建立通知管道,以回應使用者所做的決定。舉例來說,針對訊息應用程式中建立的每個對話群組,您可以分別設定通知管道。
針對 Android 8.0 及以上版本中的通知,您也可以指定管道的重要性。因此張貼在相同通知管道中的所有通知,都會有同樣的行為。
詳情請參閱「建立及管理通知管道」。
通知重要性
Android 會根據通知的「重要性」,決定通知在視覺和聽覺上對使用者的干擾程度。通知的重要性越高,對使用者的干擾程度也就越高。
在 Android 8.0 (API 等級 26) 及以上版本中,通知的重要性取決於通知所屬管道的 importance
。使用者可以在系統設定中變更通知管道的重要性 (圖 12)。在 Android 7.1 (API 等級 25) 及以下版本中,每則通知的重要性則是由通知的 priority
決定。
圖 12. 在 Android 8.0 及以上版本中,使用者可以變更每個管道的重要性
以下是您可以設定的重要性等級:
- 緊急:會發出音效,並顯示為抬頭通知。
- 高:會發出音效。
- 中:不會發出音效。
- 低:不會發出音效,也不會顯示在狀態列中。
無論重要性為何,所有通知都會顯示在不會造成干擾的系統 UI 位置 (例如通知導覽匣),也會在啟動器圖示上顯示標記 (不過,您可以修改通知標記的外觀)。
詳情請參閱「如何設定重要性」。
零打擾模式
從 Android 5.0 (API 等級 21) 開始,使用者可以啟用「零打擾模式」,禁止所有通知讓裝置發出音效或震動。通知仍會顯示在系統 UI 中,除非使用者指定其他設定。
零打擾模式提供三種不同的等級:
- 完全靜音:封鎖所有音效和震動,包括來自鬧鐘、音樂、影片和遊戲的音效和震動要求。
- 僅限鬧鐘:封鎖鬧鐘以外的所有音效和震動。
- 僅限優先通知:使用者可以設定哪種系統通用類別能夠干擾自己 (例如僅限鬧鐘、提醒、活動、通話或訊息)。使用者還可以選擇根據寄件者或來電者的身分,對訊息或通知進行篩選 (圖 13)。
圖 13. 使用者可以根據系統通用類別 (左側),以及根據寄件者或來電者的身分 (右側),決定通知的干擾程度。
在 Android 8.0 (API 等級 26) 及以上版本中,使用者可以額外允許應用程式專用類別 (也稱為管道) 的通知,方法是分別覆寫各個管道的「零干擾」設定。舉例來說,假設付款應用程式包含與提款和存款相關的通知管道。使用者可以在優先模式中,選擇允許讓提款通知、存款通知,或是兩者皆可通知。在搭載 Android 7.1 (API 等級 25) 及以下版本的裝置上,使用者可以設定是否要讓每個應用程式的通知干擾,而不是依照管道進行設定。
如要根據上述使用者設定正確地完成通知設定,您必須設定系統通用的類別和管道。
前景服務的通知
當您的應用程式執行「前景服務」時,您就需要使用通知;前景服務是指在背景長時間執行的重要 Service
,且對使用者來說至關重要,例如媒體播放器。使用者無法以一般的通知關閉方式來關閉這項通知。如要移除通知,相關服務必須停止執行或離開「前景」狀態。
詳情請參閱在前景執行服務。如果您在建構媒體播放器,請同時參閱「搭配前景服務使用 MediaStyle 通知」。
發布限制
從 Android 8.1 (API 等級 27) 開始,應用程式每秒只能發出通知音效一次。如果您的應用程式會在一秒鐘內發布數則通知,相關通知會如預期般地顯示在螢幕上,但只有第一則通知可發出音效 (每秒一次)。
不過,Android 還限制了更新通知的頻率。如果您過於頻繁地 (在不到一秒鐘內發布許多次) 發布單一通知的更新,系統可能會忽略某幾次更新。
通知相容性
從 Android 1.0 開始,通知系統的 UI 和通知相關的 API 都不斷在演變進化。如要使用最新的通知 API 功能,但同時讓應用程式支援較舊的裝置,請使用支援程式庫通知 API:NotificationCompat
及其子類別,以及 NotificationManagerCompat
。這樣一來,您就不必編寫條件式程式碼來查看 API 等級,因為這些 API 都會幫您處理好。
NotificationCompat
NotificationCompat 也隨著平台的演進而更新,現在包含最新的方法。但請注意,即使某個方法真的包含在 NotificationCompat
中,也不代表您就可以在較舊的裝置上提供相應功能。在某些案例中,在較舊的裝置上呼叫新引進的 API,會導致操作無效的結果。舉例來說,NotificationCompat.addAction()
只會在搭載 Android 4.1 (API 等級 16) 及以上版本的裝置上顯示動作按鈕。
以下摘要說明必須注意的 Android 通知行為變更。
Android 4.1 (API 等級 16)
- 引進可展開的通知範本 (稱為通知樣式),提供較大型的通知內容區域來顯示資訊。使用者只要使用單指向上/向下滑動,即可展開通知。
- 同時引進以按鈕的形式,為通知新增額外動作的功能。
- 新增可讓使用者在設定中,分別為每個應用程式關閉通知的功能。
Android 4.4 (API 等級 19 和 20)
- 在 API 中新增了通知接聽器服務。
- 在 API 等級 20 中,新增 Android Wear (現在稱為 Wear OS) 的支援功能。
Android 5.0 (API 等級 21)
- 引進螢幕鎖定畫面通知和抬頭通知。
- 使用者現在可以將手機設為「零干擾」模式,並設定在裝置處於「僅限優先通知」模式時,有哪些通知可以干擾使用者。
- API 新增了幾個方法,可用於設定是否要讓通知顯示在螢幕鎖定畫面中 (
setVisibility()
),以及指定通知文字的「公開」版本。 - 新增
setPriority()
方法,可告訴系統通知對使用者的「干擾程度」(例如,將其設定為高,就會讓通知顯示為抬頭通知)。 - 新增 Android Wear (現在稱為 Wear OS) 裝置對於通知堆疊的支援。您可以利用
setGroup()
將數則訊息組合成一個堆疊。請注意,平板電腦和手機尚未支援通知堆疊。通知堆疊後來即成為大家所知的通知群組或組合。
Android 7.0 (API 等級 24)
- 重新設計通知範本的樣式,以強調主頁橫幅和顯示圖片。
- 新增三個通知範本:一個用於簡訊應用程式,另外兩個則是用來搭配可展開的預設用途和其他系統裝飾項目來裝飾自訂內容視圖。
- 新增手持裝置 (手機和平板電腦) 對於通知群組的支援。而所使用的 API,與在 Android 5.0 (API 等級 21) 中引進 Android Wear (現在稱為 Wear OS) 通知堆疊時的 API 相同。
- 使用者可以利用內建回覆的功能,直接透過通知回覆 (使用者可以輸入文字,系統隨後會將這些文字轉送給通知的主要應用程式)。
Android 8.0 (API 等級 26)
- 您現在必須將個別的通知置於特定的管道中。
- 使用者現在可以根據管道來關閉通知,不必關閉應用程式的所有通知。
- 針對已發出通知的應用程式,系統會在主螢幕/啟動器畫面中對應的應用程式圖示上顯示通知「標記」。
- 使用者現在可以透過導覽匣延後通知。您可以為通知設定自動逾時的時間。
- 您也可以設定通知的背景色彩。
- 某些與通知行為相關的 API 已從
Notification
遷移至NotificationChannel
。舉例來說,Android 8.0 及以上版本請使用NotificationChannel.setImportance()
,而非NotificationCompat.Builder.setPriority()
。